ParserBackend class
class ParserBackend { GetterSetter _getterSetter; FilterMap _filters; ParserBackend(GetterSetter this._getterSetter, FilterMap this._filters); static Expression ZERO = new Expression((_, [_x]) => 0); getter(String path) { List<String> keys = path.split('.'); List<Function> getters = keys.map(_getterSetter.getter).toList(); if (getters.isEmpty) { return (self, [locals]) => self; } else { return (dynamic self, [Map locals]) { if (self == null) { return null; } // Cache for local closure access List<String> _keys = keys; List<Function> _getters = getters; var _gettersLength = _getters.length; num i = 0; if (locals != null) { dynamic selfNext = locals[_keys[0]]; if (selfNext == null) { if (locals.containsKey(_keys[0])) { return null; } } else { i++; self = selfNext; } } for (; i < _gettersLength; i++) { if (self is Map) { self = self[_keys[i]]; } else { self = _getters[i](self); } if (self == null) { return null; } } return self; }; } } setter(String path) { List<String> keys = path.split('.'); List<Function> getters = keys.map(_getterSetter.getter).toList(); List<Function> setters = keys.map(_getterSetter.setter).toList(); return (dynamic self, dynamic value, [Map locals]) { num i = 0; List<String> _keys = keys; List<Function> _getters = getters; List<Function> _setters = setters; var setterLengthMinusOne = _keys.length - 1; dynamic selfNext; if (locals != null && i < setterLengthMinusOne) { selfNext = locals[_keys[0]]; if (selfNext == null) { if (locals.containsKey(_keys[0])) { return null; } } else { i++; self = selfNext; } } for (; i < setterLengthMinusOne; i++) { if (self is Map) { selfNext = self[_keys[i]]; } else { selfNext = _getters[i](self); } if (selfNext == null) { selfNext = {}; if (self is Map) { self[_keys[i]] = selfNext; } else { _setters[i](self, selfNext); } } self = selfNext; } if (self is Map) { self[_keys[setterLengthMinusOne]] = value; } else { _setters[i](self, value); } return value; }; } _op(opKey) => OPERATORS[opKey]; Expression binaryFn(Expression left, String op, Expression right) => new Expression((self, [locals]) => _op(op)(self, locals, left, right)); Expression unaryFn(String op, Expression right) => new Expression((self, [locals]) => _op(op)(self, locals, right, null)); Expression assignment(Expression left, Expression right, evalError) => new Expression((self, [locals]) { try { return left.assign(self, right.eval(self, locals), locals); } catch (e, s) { throw evalError('Caught $e', s); } }); Expression multipleStatements(statements) => new Expression((self, [locals]) { var value; for ( var i = 0; i < statements.length; i++) { var statement = statements[i]; if (statement != null) value = statement.eval(self, locals); } return value; }); Expression functionCall(fn, fnName, argsFn, evalError) => new Expression((self, [locals]){ List args = []; for ( var i = 0; i < argsFn.length; i++) { args.add(argsFn[i].eval(self, locals)); } var userFn = safeFunctionCall(fn.eval(self, locals), fnName, evalError); return relaxFnApply(userFn, args); }); Expression arrayDeclaration(elementFns) => new Expression((self, [locals]){ var array = []; for ( var i = 0; i < elementFns.length; i++) { array.add(elementFns[i].eval(self, locals)); } return array; }); Expression objectIndex(obj, indexFn, evalError) => new Expression((self, [locals]) { var i = indexFn.eval(self, locals); var o = obj.eval(self, locals), v, p; v = objectIndexGetField(o, i, evalError); return v; }, (self, value, [locals]) => objectIndexSetField(obj.eval(self, locals), indexFn.eval(self, locals), value, evalError) ); Expression fieldAccess(object, field) { var setterFn = setter(field); var getterFn = getter(field); return new Expression( (self, [locals]) => getterFn(object.eval(self, locals)), (self, value, [locals]) => setterFn(object.eval(self, locals), value)); } Expression object(keyValues) => new Expression((self, [locals]){ var object = {}; for ( var i = 0; i < keyValues.length; i++) { var keyValue = keyValues[i]; var value = keyValue["value"].eval(self, locals); object[keyValue["key"]] = value; } return object; }); Expression profiled(value, _perf, text) { if (value is FilterExpression) return value; var wrappedGetter = (s, [l]) => _perf.time('angular.parser.getter', () => value.eval(s, l), text); var wrappedAssignFn = null; if (value.assign != null) { wrappedAssignFn = (s, v, [l]) => _perf.time('angular.parser.assign', () => value.assign(s, v, l), text); } return new Expression(wrappedGetter, wrappedAssignFn); } Expression fromOperator(String op) => new Expression((s, [l]) => OPERATORS[op](s, l, null, null)); Expression getterSetter(key) => new Expression(getter(key), setter(key)); Expression value(v) => new Expression((self, [locals]) => v); zero() => ZERO; FilterExpression filter(String filterName, Expression leftHandSide, List<Expression> parameters, Function evalError) { var filterFn = _filters(filterName); return new FilterExpression(filterFn, leftHandSide, parameters); } }
Static Properties
Expression ZERO #
static Expression ZERO = new Expression((_, [_x]) => 0)
Constructors
new ParserBackend(GetterSetter _getterSetter, FilterMap _filters) #
Methods
Expression arrayDeclaration(elementFns) #
Expression arrayDeclaration(elementFns) => new Expression((self, [locals]){ var array = []; for ( var i = 0; i < elementFns.length; i++) { array.add(elementFns[i].eval(self, locals)); } return array; });
Expression assignment(Expression left, Expression right, evalError) #
Expression assignment(Expression left, Expression right, evalError) => new Expression((self, [locals]) { try { return left.assign(self, right.eval(self, locals), locals); } catch (e, s) { throw evalError('Caught $e', s); } });
Expression binaryFn(Expression left, String op, Expression right) #
Expression binaryFn(Expression left, String op, Expression right) => new Expression((self, [locals]) => _op(op)(self, locals, left, right));
Expression fieldAccess(object, field) #
Expression fieldAccess(object, field) { var setterFn = setter(field); var getterFn = getter(field); return new Expression( (self, [locals]) => getterFn(object.eval(self, locals)), (self, value, [locals]) => setterFn(object.eval(self, locals), value)); }
FilterExpression filter(String filterName, Expression leftHandSide, List<Expression> parameters, Function evalError) #
FilterExpression filter(String filterName, Expression leftHandSide, List<Expression> parameters, Function evalError) { var filterFn = _filters(filterName); return new FilterExpression(filterFn, leftHandSide, parameters); }
Expression fromOperator(String op) #
Expression fromOperator(String op) => new Expression((s, [l]) => OPERATORS[op](s, l, null, null));
Expression functionCall(fn, fnName, argsFn, evalError) #
Expression functionCall(fn, fnName, argsFn, evalError) => new Expression((self, [locals]){ List args = []; for ( var i = 0; i < argsFn.length; i++) { args.add(argsFn[i].eval(self, locals)); } var userFn = safeFunctionCall(fn.eval(self, locals), fnName, evalError); return relaxFnApply(userFn, args); });
dynamic getter(String path) #
getter(String path) { List<String> keys = path.split('.'); List<Function> getters = keys.map(_getterSetter.getter).toList(); if (getters.isEmpty) { return (self, [locals]) => self; } else { return (dynamic self, [Map locals]) { if (self == null) { return null; } // Cache for local closure access List<String> _keys = keys; List<Function> _getters = getters; var _gettersLength = _getters.length; num i = 0; if (locals != null) { dynamic selfNext = locals[_keys[0]]; if (selfNext == null) { if (locals.containsKey(_keys[0])) { return null; } } else { i++; self = selfNext; } } for (; i < _gettersLength; i++) { if (self is Map) { self = self[_keys[i]]; } else { self = _getters[i](self); } if (self == null) { return null; } } return self; }; } }
Expression getterSetter(key) #
Expression getterSetter(key) => new Expression(getter(key), setter(key));
Expression multipleStatements(statements) #
Expression multipleStatements(statements) => new Expression((self, [locals]) { var value; for ( var i = 0; i < statements.length; i++) { var statement = statements[i]; if (statement != null) value = statement.eval(self, locals); } return value; });
Expression object(keyValues) #
Expression object(keyValues) => new Expression((self, [locals]){ var object = {}; for ( var i = 0; i < keyValues.length; i++) { var keyValue = keyValues[i]; var value = keyValue["value"].eval(self, locals); object[keyValue["key"]] = value; } return object; });
Expression objectIndex(obj, indexFn, evalError) #
Expression objectIndex(obj, indexFn, evalError) => new Expression((self, [locals]) { var i = indexFn.eval(self, locals); var o = obj.eval(self, locals), v, p; v = objectIndexGetField(o, i, evalError); return v; }, (self, value, [locals]) => objectIndexSetField(obj.eval(self, locals), indexFn.eval(self, locals), value, evalError) );
Expression profiled(value, _perf, text) #
Expression profiled(value, _perf, text) { if (value is FilterExpression) return value; var wrappedGetter = (s, [l]) => _perf.time('angular.parser.getter', () => value.eval(s, l), text); var wrappedAssignFn = null; if (value.assign != null) { wrappedAssignFn = (s, v, [l]) => _perf.time('angular.parser.assign', () => value.assign(s, v, l), text); } return new Expression(wrappedGetter, wrappedAssignFn); }
dynamic setter(String path) #
setter(String path) { List<String> keys = path.split('.'); List<Function> getters = keys.map(_getterSetter.getter).toList(); List<Function> setters = keys.map(_getterSetter.setter).toList(); return (dynamic self, dynamic value, [Map locals]) { num i = 0; List<String> _keys = keys; List<Function> _getters = getters; List<Function> _setters = setters; var setterLengthMinusOne = _keys.length - 1; dynamic selfNext; if (locals != null && i < setterLengthMinusOne) { selfNext = locals[_keys[0]]; if (selfNext == null) { if (locals.containsKey(_keys[0])) { return null; } } else { i++; self = selfNext; } } for (; i < setterLengthMinusOne; i++) { if (self is Map) { selfNext = self[_keys[i]]; } else { selfNext = _getters[i](self); } if (selfNext == null) { selfNext = {}; if (self is Map) { self[_keys[i]] = selfNext; } else { _setters[i](self, selfNext); } } self = selfNext; } if (self is Map) { self[_keys[setterLengthMinusOne]] = value; } else { _setters[i](self, value); } return value; }; }
Expression unaryFn(String op, Expression right) #
Expression unaryFn(String op, Expression right) => new Expression((self, [locals]) => _op(op)(self, locals, right, null));
Expression value(v) #
Expression value(v) => new Expression((self, [locals]) => v);
dynamic zero() #
zero() => ZERO;