From 29b77a2dac75f522c461478cd9fd78190d737be0 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 10 Jun 2013 16:37:21 -0600 Subject: [PATCH] Member expressions --- src/ol/expression/expression.js | 38 ++++++++++++++++++++++ src/ol/expression/parser.js | 4 ++- test/spec/ol/expression/expression.test.js | 27 +++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/ol/expression/expression.js b/src/ol/expression/expression.js index 90f05219e0..0215fc60ee 100644 --- a/src/ol/expression/expression.js +++ b/src/ol/expression/expression.js @@ -8,6 +8,7 @@ goog.provide('ol.expression.Logical'); goog.provide('ol.expression.LogicalOp'); goog.provide('ol.expression.Math'); goog.provide('ol.expression.MathOp'); +goog.provide('ol.expression.Member'); goog.provide('ol.expression.Not'); @@ -377,6 +378,43 @@ ol.expression.Math.prototype.evaluate = function(scope, opt_fns, opt_this) { +/** + * A member expression (e.g. `foo.bar`). + * + * @constructor + * @extends {ol.expression.Expression} + * @param {ol.expression.Expression} expr An expression that resolves to an + * object. + * @param {ol.expression.Identifier} property Identifier with name of property. + */ +ol.expression.Member = function(expr, property) { + + /** + * @type {ol.expression.Expression} + * @private + */ + this.expr_ = expr; + + /** + * @type {ol.expression.Identifier} + * @private + */ + this.property_ = property; + +}; +goog.inherits(ol.expression.Member, ol.expression.Expression); + + +/** + * @inheritDoc + */ +ol.expression.Member.prototype.evaluate = function(scope, opt_fns, opt_this) { + var obj = this.expr_.evaluate(scope, opt_fns, opt_this); + return this.property_.evaluate(obj); +}; + + + /** * A logical not expression (e.g. `!foo`). * diff --git a/src/ol/expression/parser.js b/src/ol/expression/parser.js index 8cddb0d177..7c81b52536 100644 --- a/src/ol/expression/parser.js +++ b/src/ol/expression/parser.js @@ -28,6 +28,7 @@ goog.require('ol.expression.Logical'); goog.require('ol.expression.LogicalOp'); goog.require('ol.expression.Math'); goog.require('ol.expression.MathOp'); +goog.require('ol.expression.Member'); goog.require('ol.expression.Not'); goog.require('ol.expression.Token'); goog.require('ol.expression.TokenType'); @@ -187,11 +188,12 @@ ol.expression.Parser.prototype.createLiteral_ = function(value) { * // TODO: make exp {ol.expression.Member|ol.expression.Identifier} * @param {ol.expression.Expression} expr Expression. * @param {ol.expression.Identifier} property Member name. + * @return {ol.expression.Member} The member expression. * @private */ ol.expression.Parser.prototype.createMemberExpression_ = function(expr, property) { - throw new Error('Not implemented'); + return new ol.expression.Member(expr, property); }; diff --git a/test/spec/ol/expression/expression.test.js b/test/spec/ol/expression/expression.test.js index 7080c55a5c..e0d21b3349 100644 --- a/test/spec/ol/expression/expression.test.js +++ b/test/spec/ol/expression/expression.test.js @@ -392,6 +392,32 @@ describe('ol.expression.Math', function() { }); +describe('ol.expression.Member', function() { + describe('constructor', function() { + it('creates a new expression', function() { + var expr = new ol.expression.Member( + new ol.expression.Identifier('foo'), + new ol.expression.Identifier('bar')); + + expect(expr).to.be.a(ol.expression.Expression); + expect(expr).to.be.a(ol.expression.Member); + }); + }); + + describe('#evaluate()', function() { + it('accesses an object property', function() { + + var expr = new ol.expression.Member( + new ol.expression.Identifier('foo'), + new ol.expression.Identifier('bar')); + + var scope = {foo: {bar: 42}}; + expect(expr.evaluate(scope)).to.be(42); + }); + }); +}); + + describe('ol.expression.Not', function() { describe('constructor', function() { @@ -446,4 +472,5 @@ goog.require('ol.expression.Logical'); goog.require('ol.expression.LogicalOp'); goog.require('ol.expression.Math'); goog.require('ol.expression.MathOp'); +goog.require('ol.expression.Member'); goog.require('ol.expression.Not');