From 79085333368d4e789d6dc4fc2fa37c276818f348 Mon Sep 17 00:00:00 2001 From: vsavkin Date: Thu, 6 Nov 2014 09:09:34 -0800 Subject: [PATCH] refactor(Parser): cleanup --- modules/change_detection/src/parser/ast.js | 21 +++++++++++-------- .../src/parser/closure_map.es6 | 2 +- .../test/parser/parser_spec.js | 7 ++++--- modules/facade/src/collection.es6 | 2 +- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/modules/change_detection/src/parser/ast.js b/modules/change_detection/src/parser/ast.js index 38e1a36873..dac56d4e49 100644 --- a/modules/change_detection/src/parser/ast.js +++ b/modules/change_detection/src/parser/ast.js @@ -1,4 +1,4 @@ -import {FIELD, toBool, autoConvertAdd, isBlank, FunctionWrapper, BaseException} from "facade/lang"; +import {FIELD, autoConvertAdd, isBlank, isPresent, FunctionWrapper, BaseException} from "facade/lang"; import {List, Map, ListWrapper, MapWrapper} from "facade/collection"; import {ClosureMap} from "./closure_map"; @@ -29,6 +29,9 @@ export class ImplicitReceiver extends AST { } } +/** + * Multiple expressions separated by a semicolon. + */ export class Chain extends AST { @FIELD('final expressions:List') constructor(expressions:List) { @@ -39,7 +42,7 @@ export class Chain extends AST { var result; for (var i = 0; i < this.expressions.length; i++) { var last = this.expressions[i].eval(context); - if (last != null) result = last; + if (isPresent(last)) result = last; } return result; } @@ -118,7 +121,7 @@ export class KeyedAccess extends AST { } else if (obj instanceof List) { return ListWrapper.get(obj, key); } else { - throw new BaseException(`Cannot access ${key} on ${obj}`); + return obj[key]; } } @@ -135,7 +138,7 @@ export class KeyedAccess extends AST { } else if (obj instanceof List) { ListWrapper.set(obj, key, value); } else { - throw new BaseException(`Cannot access ${key} on ${obj}`); + obj[key] = value; } return value; } @@ -225,14 +228,14 @@ export class Binary extends AST { eval(context) { var left = this.left.eval(context); switch (this.operation) { - case '&&': return toBool(left) && toBool(this.right.eval(context)); - case '||': return toBool(left) || toBool(this.right.eval(context)); + case '&&': return left && this.right.eval(context); + case '||': return left || this.right.eval(context); } var right = this.right.eval(context); // Null check for the operations. - if (left == null || right == null) { - throw new BaseException("One of the operands is null"); + if (isBlank(left)|| isBlank(right)) { + throw new BaseException("One of the operands is not defined"); } switch (this.operation) { @@ -266,7 +269,7 @@ export class PrefixNot extends AST { } eval(context) { - return !toBool(this.expression.eval(context)); + return !this.expression.eval(context); } visit(visitor) { diff --git a/modules/change_detection/src/parser/closure_map.es6 b/modules/change_detection/src/parser/closure_map.es6 index 1bb6c39aa6..b77b76d303 100644 --- a/modules/change_detection/src/parser/closure_map.es6 +++ b/modules/change_detection/src/parser/closure_map.es6 @@ -10,6 +10,6 @@ export class ClosureMap { } fn(name:string) { - return new Function('o', 'pos', 'return o.' + name + '.apply(o, pos);'); + return new Function('o', 'args', 'return o.' + name + '.apply(o, args);'); } } diff --git a/modules/change_detection/test/parser/parser_spec.js b/modules/change_detection/test/parser/parser_spec.js index 7e218937f5..3e4ee33955 100644 --- a/modules/change_detection/test/parser/parser_spec.js +++ b/modules/change_detection/test/parser/parser_spec.js @@ -209,10 +209,11 @@ export function main() { it('should evaluate map', () => { expectEval("{}").toEqual(MapWrapper.create()); - expectEval("{a:'b'}").toEqual(MapWrapper.createFromPairs([["a", "b"]])); - expectEval("{'a':'b'}").toEqual(MapWrapper.createFromPairs([["a", "b"]])); - expectEval("{\"a\":'b'}").toEqual(MapWrapper.createFromPairs([["a", "b"]])); + expectEval("{a:'b'}['a']").toEqual('b'); + expectEval("{'a':'b'}['a']").toEqual('b'); + expectEval("{\"a\":'b'}['a']").toEqual('b'); expectEval("{\"a\":'b'}['a']").toEqual("b"); + expectEval("{}['a']").not.toBeDefined(); expectEval("{\"a\":'b'}['invalid']").not.toBeDefined(); }); diff --git a/modules/facade/src/collection.es6 b/modules/facade/src/collection.es6 index bfc3b857dc..77f2b3fbfb 100644 --- a/modules/facade/src/collection.es6 +++ b/modules/facade/src/collection.es6 @@ -6,7 +6,7 @@ export var Set = window.Set; export class MapWrapper { static create():Map { return new Map(); } - static createFromPairs(pairs:List):Map { return new Map(pairs); } + static createFromPairs(pairs:List):Map {return new Map(pairs);} static get(m, k) { return m.get(k); } static set(m, k, v) { m.set(k,v); } static contains(m, k) { return m.has(k); }