feat(parser): changed parser to parse pipes in the middle of a binding
This commit is contained in:
parent
e927342e58
commit
7bd682bb27
|
@ -211,18 +211,11 @@ class _ParseAST {
|
||||||
|
|
||||||
parsePipe() {
|
parsePipe() {
|
||||||
var result = this.parseExpression();
|
var result = this.parseExpression();
|
||||||
while (this.optionalOperator("|")) {
|
if (this.optionalOperator("|")) {
|
||||||
if (this.parseAction) {
|
return this.parseInlinedPipe(result);
|
||||||
this.error("Cannot have a pipe in an action expression");
|
} else {
|
||||||
}
|
return result;
|
||||||
var name = this.expectIdentifierOrKeyword();
|
|
||||||
var args = ListWrapper.create();
|
|
||||||
while (this.optionalCharacter($COLON)) {
|
|
||||||
ListWrapper.push(args, this.parseExpression());
|
|
||||||
}
|
|
||||||
result = new Pipe(result, name, args, true);
|
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
parseExpression() {
|
parseExpression() {
|
||||||
|
@ -464,10 +457,32 @@ class _ParseAST {
|
||||||
} else {
|
} else {
|
||||||
var getter = this.reflector.getter(id);
|
var getter = this.reflector.getter(id);
|
||||||
var setter = this.reflector.setter(id);
|
var setter = this.reflector.setter(id);
|
||||||
return new AccessMember(receiver, id, getter, setter);
|
var am = new AccessMember(receiver, id, getter, setter);
|
||||||
|
|
||||||
|
if (this.optionalOperator("|")) {
|
||||||
|
return this.parseInlinedPipe(am);
|
||||||
|
} else {
|
||||||
|
return am;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parseInlinedPipe(result) {
|
||||||
|
do {
|
||||||
|
if (this.parseAction) {
|
||||||
|
this.error("Cannot have a pipe in an action expression");
|
||||||
|
}
|
||||||
|
var name = this.expectIdentifierOrKeyword();
|
||||||
|
var args = ListWrapper.create();
|
||||||
|
while (this.optionalCharacter($COLON)) {
|
||||||
|
ListWrapper.push(args, this.parseExpression());
|
||||||
|
}
|
||||||
|
result = new Pipe(result, name, args, true);
|
||||||
|
} while(this.optionalOperator("|"));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
parseCallArguments() {
|
parseCallArguments() {
|
||||||
if (this.next.isCharacter($RPAREN)) return [];
|
if (this.next.isCharacter($RPAREN)) return [];
|
||||||
var positionals = [];
|
var positionals = [];
|
||||||
|
|
|
@ -381,11 +381,29 @@ export function main() {
|
||||||
expect(exp.name).toEqual("uppercase");
|
expect(exp.name).toEqual("uppercase");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should parse pipes in the middle of a binding", () => {
|
||||||
|
var exp = parseBinding("user|a|b.name").ast;
|
||||||
|
|
||||||
|
expect(exp.name).toEqual("name");
|
||||||
|
expect(exp.receiver).toBeAnInstanceOf(Pipe);
|
||||||
|
expect(exp.receiver.name).toEqual("b");
|
||||||
|
|
||||||
|
expect(exp.receiver.exp).toBeAnInstanceOf(Pipe);
|
||||||
|
expect(exp.receiver.exp.name).toEqual("a");
|
||||||
|
});
|
||||||
|
|
||||||
it("should parse pipes with args", () => {
|
it("should parse pipes with args", () => {
|
||||||
var exp = parseBinding("1|increment:2").ast;
|
var exp = parseBinding("(1|a:2)|b:3").ast;
|
||||||
|
|
||||||
expect(exp).toBeAnInstanceOf(Pipe);
|
expect(exp).toBeAnInstanceOf(Pipe);
|
||||||
expect(exp.name).toEqual("increment");
|
expect(exp.name).toEqual("b");
|
||||||
expect(exp.args[0]).toBeAnInstanceOf(LiteralPrimitive);
|
expect(exp.args[0]).toBeAnInstanceOf(LiteralPrimitive);
|
||||||
|
|
||||||
|
expect(exp.exp).toBeAnInstanceOf(Pipe);
|
||||||
|
expect(exp.exp.name).toEqual("a");
|
||||||
|
expect(exp.exp.args[0]).toBeAnInstanceOf(LiteralPrimitive);
|
||||||
|
|
||||||
|
expect(exp.exp.exp).toBeAnInstanceOf(LiteralPrimitive);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should only allow identifier or keyword as formatter names', () => {
|
it('should only allow identifier or keyword as formatter names', () => {
|
||||||
|
|
Loading…
Reference in New Issue