Member expressions

This commit is contained in:
Tim Schaub
2013-06-10 16:37:21 -06:00
parent fbb028e15e
commit 29b77a2dac
3 changed files with 68 additions and 1 deletions

View File

@@ -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`).
*

View File

@@ -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);
};

View File

@@ -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');