feat(parser): changed parser to parse pipes in the middle of a binding

This commit is contained in:
vsavkin 2015-04-15 13:34:59 -07:00
parent e927342e58
commit 7bd682bb27
2 changed files with 47 additions and 14 deletions

View File

@ -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 = [];

View File

@ -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', () => {