| OLD | NEW |
| 1 library angular.core.parser.eval; | 1 library angular.core.parser.eval; |
| 2 | 2 |
| 3 import 'package:angular/core/parser/syntax.dart' as syntax; | 3 import 'package:angular/core/parser/syntax.dart' as syntax; |
| 4 import 'package:angular/core/parser/utils.dart'; | 4 import 'package:angular/core/parser/utils.dart'; |
| 5 import 'package:angular/core/module.dart'; | 5 import 'package:angular/core/module_internal.dart'; |
| 6 | 6 |
| 7 export 'package:angular/core/parser/eval_access.dart'; | 7 export 'package:angular/core/parser/eval_access.dart'; |
| 8 export 'package:angular/core/parser/eval_calls.dart'; | 8 export 'package:angular/core/parser/eval_calls.dart'; |
| 9 | 9 |
| 10 class Chain extends syntax.Chain { | 10 class Chain extends syntax.Chain { |
| 11 Chain(List<syntax.Expression> expressions) : super(expressions); | 11 Chain(List<syntax.Expression> expressions) : super(expressions); |
| 12 eval(scope, [FilterMap filters]) { | 12 eval(scope, [FormatterMap formatters]) { |
| 13 var result; | 13 var result; |
| 14 for (int i = 0; i < expressions.length; i++) { | 14 for (int i = 0; i < expressions.length; i++) { |
| 15 var last = expressions[i].eval(scope, filters); | 15 var last = expressions[i].eval(scope, formatters); |
| 16 if (last != null) result = last; | 16 if (last != null) result = last; |
| 17 } | 17 } |
| 18 return result; | 18 return result; |
| 19 } | 19 } |
| 20 } | 20 } |
| 21 | 21 |
| 22 class Filter extends syntax.Filter { | 22 class Filter extends syntax.Filter { |
| 23 final List allArguments; | 23 final List<syntax.Expression> allArguments; |
| 24 Filter(syntax.Expression expression, String name, List<syntax.Expression> argu
ments, | 24 Filter(syntax.Expression expression, String name, List<syntax.Expression> argu
ments, |
| 25 List<syntax.Expression> this.allArguments) | 25 this.allArguments) |
| 26 : super(expression, name, arguments); | 26 : super(expression, name, arguments); |
| 27 | 27 |
| 28 eval(scope, [FilterMap filters]) => | 28 eval(scope, [FormatterMap formatters]) => |
| 29 Function.apply(filters(name), evalList(scope, allArguments, filters)); | 29 Function.apply(formatters(name), evalList(scope, allArguments, formatters)
); |
| 30 } | 30 } |
| 31 | 31 |
| 32 class Assign extends syntax.Assign { | 32 class Assign extends syntax.Assign { |
| 33 Assign(syntax.Expression target, value) : super(target, value); | 33 Assign(syntax.Expression target, value) : super(target, value); |
| 34 eval(scope, [FilterMap filters]) => | 34 eval(scope, [FormatterMap formatters]) => |
| 35 target.assign(scope, value.eval(scope, filters)); | 35 target.assign(scope, value.eval(scope, formatters)); |
| 36 } | 36 } |
| 37 | 37 |
| 38 class Conditional extends syntax.Conditional { | 38 class Conditional extends syntax.Conditional { |
| 39 Conditional(syntax.Expression condition, | 39 Conditional(syntax.Expression condition, |
| 40 syntax.Expression yes, syntax.Expression no): super(condition, yes
, no); | 40 syntax.Expression yes, syntax.Expression no) |
| 41 eval(scope, [FilterMap filters]) => toBool(condition.eval(scope)) | 41 : super(condition, yes, no); |
| 42 ? yes.eval(scope) | 42 eval(scope, [FormatterMap formatters]) => toBool(condition.eval(scope, formatt
ers)) |
| 43 : no.eval(scope); | 43 ? yes.eval(scope, formatters) |
| 44 : no.eval(scope, formatters); |
| 44 } | 45 } |
| 45 | 46 |
| 46 class PrefixNot extends syntax.Prefix { | 47 class PrefixNot extends syntax.Prefix { |
| 47 PrefixNot(syntax.Expression expression) : super('!', expression); | 48 PrefixNot(syntax.Expression expression) : super('!', expression); |
| 48 eval(scope, [FilterMap filters]) => !toBool(expression.eval(scope)); | 49 eval(scope, [FormatterMap formatters]) => !toBool(expression.eval(scope, forma
tters)); |
| 49 } | 50 } |
| 50 | 51 |
| 51 class Binary extends syntax.Binary { | 52 class Binary extends syntax.Binary { |
| 52 Binary(String operation, syntax.Expression left, syntax.Expression right): | 53 Binary(String operation, syntax.Expression left, syntax.Expression right): |
| 53 super(operation, left, right); | 54 super(operation, left, right); |
| 54 eval(scope, [FilterMap filters]) { | 55 eval(scope, [FormatterMap formatters]) { |
| 55 var left = this.left.eval(scope); | 56 var left = this.left.eval(scope, formatters); |
| 56 switch (operation) { | 57 switch (operation) { |
| 57 case '&&': return toBool(left) && toBool(this.right.eval(scope)); | 58 case '&&': return toBool(left) && toBool(this.right.eval(scope, formatters
)); |
| 58 case '||': return toBool(left) || toBool(this.right.eval(scope)); | 59 case '||': return toBool(left) || toBool(this.right.eval(scope, formatters
)); |
| 59 } | 60 } |
| 60 var right = this.right.eval(scope); | 61 var right = this.right.eval(scope, formatters); |
| 62 |
| 63 // Null check for the operations. |
| 64 if (left == null || right == null) { |
| 65 switch (operation) { |
| 66 case '+': |
| 67 if (left != null) return left; |
| 68 if (right != null) return right; |
| 69 return 0; |
| 70 case '-': |
| 71 if (left != null) return left; |
| 72 if (right != null) return 0 - right; |
| 73 return 0; |
| 74 } |
| 75 return null; |
| 76 } |
| 77 |
| 61 switch (operation) { | 78 switch (operation) { |
| 62 case '+' : return autoConvertAdd(left, right); | 79 case '+' : return autoConvertAdd(left, right); |
| 63 case '-' : return left - right; | 80 case '-' : return left - right; |
| 64 case '*' : return left * right; | 81 case '*' : return left * right; |
| 65 case '/' : return left / right; | 82 case '/' : return left / right; |
| 66 case '~/' : return left ~/ right; | 83 case '~/' : return left ~/ right; |
| 67 case '%' : return left % right; | 84 case '%' : return left % right; |
| 68 case '==' : return left == right; | 85 case '==' : return left == right; |
| 69 case '!=' : return left != right; | 86 case '!=' : return left != right; |
| 70 case '<' : return left < right; | 87 case '<' : return left < right; |
| 71 case '>' : return left > right; | 88 case '>' : return left > right; |
| 72 case '<=' : return left <= right; | 89 case '<=' : return left <= right; |
| 73 case '>=' : return left >= right; | 90 case '>=' : return left >= right; |
| 74 case '^' : return left ^ right; | 91 case '^' : return left ^ right; |
| 75 case '&' : return left & right; | 92 case '&' : return left & right; |
| 76 } | 93 } |
| 77 throw new EvalError('Internal error [$operation] not handled'); | 94 throw new EvalError('Internal error [$operation] not handled'); |
| 78 } | 95 } |
| 79 } | 96 } |
| 80 | 97 |
| 81 class LiteralPrimitive extends syntax.LiteralPrimitive { | 98 class LiteralPrimitive extends syntax.LiteralPrimitive { |
| 82 LiteralPrimitive(dynamic value) : super(value); | 99 LiteralPrimitive(dynamic value) : super(value); |
| 83 eval(scope, [FilterMap filters]) => value; | 100 eval(scope, [FormatterMap formatters]) => value; |
| 84 } | 101 } |
| 85 | 102 |
| 86 class LiteralString extends syntax.LiteralString { | 103 class LiteralString extends syntax.LiteralString { |
| 87 LiteralString(String value) : super(value); | 104 LiteralString(String value) : super(value); |
| 88 eval(scope, [FilterMap filters]) => value; | 105 eval(scope, [FormatterMap formatters]) => value; |
| 89 } | 106 } |
| 90 | 107 |
| 91 class LiteralArray extends syntax.LiteralArray { | 108 class LiteralArray extends syntax.LiteralArray { |
| 92 LiteralArray(List<syntax.Expression> elements) : super(elements); | 109 LiteralArray(List<syntax.Expression> elements) : super(elements); |
| 93 eval(scope, [FilterMap filters]) => | 110 eval(scope, [FormatterMap formatters]) => |
| 94 elements.map((e) => e.eval(scope, filters)).toList(); | 111 elements.map((e) => e.eval(scope, formatters)).toList(); |
| 95 } | 112 } |
| 96 | 113 |
| 97 class LiteralObject extends syntax.LiteralObject { | 114 class LiteralObject extends syntax.LiteralObject { |
| 98 LiteralObject(List<String> keys, List<syntax.Expression>values) : super(keys,
values); | 115 LiteralObject(List<String> keys, List<syntax.Expression>values) : super(keys,
values); |
| 99 eval(scope, [FilterMap filters]) => | 116 eval(scope, [FormatterMap formatters]) => |
| 100 new Map.fromIterables(keys, values.map((e) => e.eval(scope, filters))); | 117 new Map.fromIterables(keys, values.map((e) => e.eval(scope, formatters))); |
| 101 } | 118 } |
| OLD | NEW |