From 0fbf07fef116706863e6c34209370fdfac616a1a Mon Sep 17 00:00:00 2001 From: ahocevar Date: Wed, 28 Aug 2013 18:00:09 +0200 Subject: [PATCH] Using a renderIntent lib function instead of this identifier A 'this' identifier is quite useless with compressed JavaScript, and in fact it turned out to fail in advanced mode when trying to access a feature's renderIntent property with it. The added renderIntent lib function as a Call expression does the job well. --- examples/select-features.js | 2 +- src/ol/expr/expression.js | 12 ++++++++++++ src/ol/expr/expressions.js | 22 ---------------------- src/ol/expr/lexer.js | 3 +-- src/ol/expr/parser.js | 13 ------------- test/spec/ol/expr/expression.test.js | 24 ++++++++++++++++++------ test/spec/ol/expr/expressions.test.js | 20 -------------------- 7 files changed, 32 insertions(+), 64 deletions(-) diff --git a/examples/select-features.js b/examples/select-features.js index 88f8512e39..4145b6f25c 100644 --- a/examples/select-features.js +++ b/examples/select-features.js @@ -25,7 +25,7 @@ var vector = new ol.layer.Vector({ style: new ol.style.Style({ rules: [ new ol.style.Rule({ - filter: 'this.renderIntent == "selected"', + filter: 'renderIntent("selected")', symbolizers: [ new ol.style.Fill({ color: '#ffffff', diff --git a/src/ol/expr/expression.js b/src/ol/expr/expression.js index dda7330ea6..cdbe012936 100644 --- a/src/ol/expr/expression.js +++ b/src/ol/expr/expression.js @@ -99,6 +99,7 @@ ol.expr.functions = { EXTENT: 'extent', FID: 'fid', GEOMETRY_TYPE: 'geometryType', + RENDER_INTENT: 'renderIntent', INTERSECTS: 'intersects', CONTAINS: 'contains', DWITHIN: 'dwithin', @@ -252,6 +253,17 @@ ol.expr.lib[ol.expr.functions.GEOMETRY_TYPE] = function(type) { }; +/** + * Determine if a feature's renderIntent matches the given one. + * @param {string} renderIntent Render intent. + * @return {boolean} The feature's renderIntent matches the given one. + * @this {ol.Feature} + */ +ol.expr.lib[ol.expr.functions.RENDER_INTENT] = function(renderIntent) { + return this.renderIntent == renderIntent; +}; + + ol.expr.lib[ol.expr.functions.INTERSECTS] = function(geom, opt_projection, opt_attribute) { throw new Error('Spatial function not implemented: ' + diff --git a/src/ol/expr/expressions.js b/src/ol/expr/expressions.js index 1b42603ee6..f98d595b8e 100644 --- a/src/ol/expr/expressions.js +++ b/src/ol/expr/expressions.js @@ -10,7 +10,6 @@ goog.provide('ol.expr.Math'); goog.provide('ol.expr.MathOp'); goog.provide('ol.expr.Member'); goog.provide('ol.expr.Not'); -goog.provide('ol.expr.ThisIdentifier'); @@ -625,24 +624,3 @@ ol.expr.Not.prototype.evaluate = function(opt_scope, opt_fns, opt_this) { ol.expr.Not.prototype.getArgument = function() { return this.argument_; }; - - - -/** - * An identifier for the 'this' keyword. - * - * @constructor - * @extends {ol.expr.Expression} - */ -ol.expr.ThisIdentifier = function() {}; -goog.inherits(ol.expr.ThisIdentifier, ol.expr.Expression); -goog.addSingletonGetter(ol.expr.ThisIdentifier); - - -/** - * @inheritDoc - */ -ol.expr.ThisIdentifier.prototype.evaluate = - function(opt_scope, opt_fns, opt_this) { - return opt_this; -}; diff --git a/src/ol/expr/lexer.js b/src/ol/expr/lexer.js index 41a69eb8c6..d0fa744a22 100644 --- a/src/ol/expr/lexer.js +++ b/src/ol/expr/lexer.js @@ -516,8 +516,7 @@ ol.expr.Lexer.prototype.scanIdentifier_ = function(code) { if (id.length === 1) { type = ol.expr.TokenType.IDENTIFIER; } else if (this.isKeyword_(id)) { - type = (id === 'this') ? - ol.expr.TokenType.THIS_IDENTIFIER : ol.expr.TokenType.KEYWORD; + type = ol.expr.TokenType.KEYWORD; } else if (id === 'null') { type = ol.expr.TokenType.NULL_LITERAL; } else if (id === 'true' || id === 'false') { diff --git a/src/ol/expr/parser.js b/src/ol/expr/parser.js index 03be0dd75b..f11cdd5603 100644 --- a/src/ol/expr/parser.js +++ b/src/ol/expr/parser.js @@ -30,7 +30,6 @@ goog.require('ol.expr.Math'); goog.require('ol.expr.MathOp'); goog.require('ol.expr.Member'); goog.require('ol.expr.Not'); -goog.require('ol.expr.ThisIdentifier'); goog.require('ol.expr.Token'); goog.require('ol.expr.TokenType'); goog.require('ol.expr.UnexpectedToken'); @@ -199,16 +198,6 @@ ol.expr.Parser.prototype.createMemberExpression_ = function(object, }; -/** - * Create a 'this' identifier. - * @return {ol.expr.ThisIdentifier} The 'this' identifier. - * @private - */ -ol.expr.Parser.prototype.createThisIdentifier_ = function() { - return ol.expr.ThisIdentifier.getInstance(); -}; - - /** * Create a unary expression. The only true unary operator supported here is * "!". For +/-, we apply the operator to literal expressions and return @@ -445,8 +434,6 @@ ol.expr.Parser.prototype.parsePrimaryExpression_ = function(lexer) { expr = this.createLiteral_(token.value === 'true'); } else if (type === ol.expr.TokenType.NULL_LITERAL) { expr = this.createLiteral_(null); - } else if (type === ol.expr.TokenType.THIS_IDENTIFIER) { - expr = this.createThisIdentifier_(); } else { throw new ol.expr.UnexpectedToken(token); } diff --git a/test/spec/ol/expr/expression.test.js b/test/spec/ol/expr/expression.test.js index b358ecb848..22927fa0ef 100644 --- a/test/spec/ol/expr/expression.test.js +++ b/test/spec/ol/expr/expression.test.js @@ -92,12 +92,6 @@ describe('ol.expr.parse()', function() { expect(expr.evaluate(scope)).to.be(42); }); - it('parses member expressions in the \'this\' scope', function() { - var expr = ol.expr.parse('this.foo'); - var thisScope = {foo: 'bar'}; - expect(expr.evaluate(undefined, undefined, thisScope)).to.be('bar'); - }); - it('consumes whitespace as expected', function() { var expr = ol.expr.parse(' foo . bar . baz '); expect(expr).to.be.a(ol.expr.Member); @@ -878,6 +872,24 @@ describe('ol.expr.lib', function() { }); + describe('renderIntent()', function() { + + var feature = new ol.Feature(); + feature.renderIntent = 'foo'; + + var isFoo = parse('renderIntent("foo")'); + var isBar = parse('renderIntent("bar")'); + + it('True when renderIntent matches', function() { + expect(evaluate(isFoo, feature), true); + }); + + it('False when renderIntent does not match', function() { + expect(evaluate(isBar, feature), false); + }); + + }); + }); describe('ol.expr.register()', function() { diff --git a/test/spec/ol/expr/expressions.test.js b/test/spec/ol/expr/expressions.test.js index 3a6f07a743..c64ea7cd52 100644 --- a/test/spec/ol/expr/expressions.test.js +++ b/test/spec/ol/expr/expressions.test.js @@ -624,25 +624,6 @@ describe('ol.expr.Not', function() { }); -describe('ol.expr.ThisIdentifier', function() { - - describe('#getInstance()', function() { - it('has a getInstance method to return the singleton', function() { - expect(ol.expr.ThisIdentifier.getInstance()) - .to.be.a(ol.expr.ThisIdentifier); - }); - }); - - describe('#evaluate()', function() { - it('evaluates to the passed scope', function() { - expect(ol.expr.ThisIdentifier.getInstance() - .evaluate(undefined, undefined, 'foo')).to.be('foo'); - }); - }); - -}); - - goog.require('ol.expr.Call'); goog.require('ol.expr.Comparison'); goog.require('ol.expr.ComparisonOp'); @@ -655,4 +636,3 @@ goog.require('ol.expr.Math'); goog.require('ol.expr.MathOp'); goog.require('ol.expr.Member'); goog.require('ol.expr.Not'); -goog.require('ol.expr.ThisIdentifier');