Skip to content

Commit

Permalink
fix(parser): allow $parent as an argument of binding behaviors and va…
Browse files Browse the repository at this point in the history
…lue converters

- Closes #608
  • Loading branch information
fkleuver committed Jun 6, 2018
1 parent c2bf275 commit f76de45
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 8 deletions.
12 changes: 6 additions & 6 deletions src/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ export class ParserImplementation {
}

parseBinary(minPrecedence) {
let left = this.parseLeftHandSideExpression();
let left = this.parseLeftHandSideExpression(0);

while (this.currentToken & T$BinaryOp) {
const opToken = this.currentToken;
Expand All @@ -118,20 +118,20 @@ export class ParserImplementation {
return left;
}

parseLeftHandSideExpression(context = 0) {
parseLeftHandSideExpression(context) {
let result;

// Unary + Primary expression
primary: switch (this.currentToken) {
case T$Plus:
this.nextToken();
return this.parseLeftHandSideExpression();
return this.parseLeftHandSideExpression(0);
case T$Minus:
this.nextToken();
return new Binary('-', new LiteralPrimitive(0), this.parseLeftHandSideExpression());
return new Binary('-', new LiteralPrimitive(0), this.parseLeftHandSideExpression(0));
case T$Bang:
this.nextToken();
return new PrefixNot('!', this.parseLeftHandSideExpression());
return new PrefixNot('!', this.parseLeftHandSideExpression(0));
case T$ParentScope: // $parent
{
do {
Expand Down Expand Up @@ -554,7 +554,7 @@ const T$MemberOrCallExpression = 1 << 24;
/** ',' */ const T$Comma = 12 | T$AccessScopeTerminal;
/** '[' */ const T$LBracket = 13 | T$OpeningToken | T$AccessScopeTerminal | T$MemberExpression | T$MemberOrCallExpression;
/** ']' */ const T$RBracket = 14 | T$ClosingToken | T$ExpressionTerminal;
/** ':' */ const T$Colon = 15;
/** ':' */ const T$Colon = 15 | T$AccessScopeTerminal;
/** '?' */ const T$Question = 16;

// Operator precedence: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table
Expand Down
24 changes: 22 additions & 2 deletions test/parser.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -276,9 +276,29 @@ describe('Parser', () => {
)
});

describe('parses BindingBehavior', () => {
const variadics = [
{ ctor: BindingBehavior, op: '&' },
{ ctor: ValueConverter, op: '|' }
];

for (const variadic of variadics) {
describe(`parses ${variadic.ctor.name} with scope arguments`, () => {
const tests = [
{ expression: `foo${variadic.op}bar:$this:$this`, expected: new variadic.ctor(new AccessScope('foo', 0), 'bar', [new AccessThis(0), new AccessThis(0)]) },
{ expression: `foo${variadic.op}bar:$this:$parent`, expected: new variadic.ctor(new AccessScope('foo', 0), 'bar', [new AccessThis(0), new AccessThis(1)]) },
{ expression: `foo${variadic.op}bar:$parent:$this`, expected: new variadic.ctor(new AccessScope('foo', 0), 'bar', [new AccessThis(1), new AccessThis(0)]) },
{ expression: `foo${variadic.op}bar:$parent.$parent:$parent.$parent`, expected: new variadic.ctor(new AccessScope('foo', 0), 'bar', [new AccessThis(2), new AccessThis(2)]) }
];

for (const test of tests) {
it(test.expression, () => {
let expression = parser.parse(test.expression);
verifyEqual(expression, test.expected);
});
}
});
}

});

it('parses binding behavior', () => {
let expression = parser.parse('foo & bar');
Expand Down

0 comments on commit f76de45

Please sign in to comment.