refactor(Parser): cleanup
This commit is contained in:
parent
693489ce38
commit
7908533336
|
@ -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) {
|
||||
|
|
|
@ -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);');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
|
||||
|
|
|
@ -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); }
|
||||
|
|
Loading…
Reference in New Issue