diff --git a/src/ol/expression/parser.js b/src/ol/expression/parser.js index 0ec2808797..b0a0f68bf3 100644 --- a/src/ol/expression/parser.js +++ b/src/ol/expression/parser.js @@ -236,12 +236,14 @@ ol.expression.Parser.prototype.parseArguments_ = function(lexer) { lexer.expect('('); - while (!lexer.match(')')) { - args.push(this.parseBinaryExpression_(lexer)); - if (lexer.match(')')) { - break; + if (!lexer.match(')')) { + while (true) { + args.push(this.parseBinaryExpression_(lexer)); + if (lexer.match(')')) { + break; + } + lexer.expect(','); } - lexer.expect(','); } lexer.skip(); @@ -355,6 +357,7 @@ ol.expression.Parser.prototype.parseLeftHandSideExpression_ = function(lexer) { while (token.value === '.') { var property = this.parseNonComputedMember_(lexer); expr = this.createMemberExpression_(expr, property); + token = lexer.peek(); } } return expr; diff --git a/test/spec/ol/expression/expression.test.js b/test/spec/ol/expression/expression.test.js index 8f5f5cc212..dab53c249a 100644 --- a/test/spec/ol/expression/expression.test.js +++ b/test/spec/ol/expression/expression.test.js @@ -61,6 +61,44 @@ describe('ol.expression.parse', function() { }); + describe('left-hand-side expressions', function() { + // http://www.ecma-international.org/ecma-262/5.1/#sec-11.2 + + it('parses member expressions with dot notation', function() { + var expr = ol.expression.parse('foo.bar.baz'); + expect(expr).to.be.a(ol.expression.Member); + var scope = {foo: {bar: {baz: 42}}}; + expect(expr.evaluate(scope)).to.be(42); + }); + + it('throws on invalid member expression', function() { + expect(function() { + ol.expression.parse('foo.4bar'); + }).throwException(); + }); + + it('parses call expressions with literal arguments', function() { + var expr = ol.expression.parse('foo(42, "bar")'); + expect(expr).to.be.a(ol.expression.Call); + var scope = { + foo: function(num, str) { + expect(num).to.be(42); + expect(str).to.be('bar'); + return str + num; + } + }; + expect(expr.evaluate(scope)).to.be('bar42'); + }); + + it('throws on calls with unterminated arguments', function() { + expect(function() { + ol.expression.parse('foo(42,)'); + }).throwException(); + }); + + }); + + });