OLD | NEW |
1 library angular.core.parser.syntax; | 1 library angular.core.parser.syntax; |
2 | 2 |
3 import 'package:angular/core/parser/parser.dart' show LocalsWrapper; | 3 import 'package:angular/core/parser/parser.dart' show LocalsWrapper; |
4 import 'package:angular/core/parser/unparser.dart' show Unparser; | 4 import 'package:angular/core/parser/unparser.dart' show Unparser; |
5 import 'package:angular/core/parser/utils.dart' show EvalError; | 5 import 'package:angular/core/parser/utils.dart' show EvalError; |
6 import 'package:angular/core/module.dart'; | 6 import 'package:angular/core/module_internal.dart'; |
7 | 7 |
8 abstract class Visitor { | 8 abstract class Visitor { |
9 visit(Expression expression) | 9 visit(Expression expression) => expression.accept(this); |
10 => expression.accept(this); | |
11 | 10 |
12 visitExpression(Expression expression) | 11 visitExpression(Expression expression) => null; |
13 => null; | 12 visitChain(Chain expression) => visitExpression(expression); |
14 visitChain(Chain expression) | 13 visitFilter(Filter expression) => visitExpression(expression); |
15 => visitExpression(expression); | |
16 visitFilter(Filter expression) | |
17 => visitExpression(expression); | |
18 | 14 |
19 visitAssign(Assign expression) | 15 visitAssign(Assign expression) => visitExpression(expression); |
20 => visitExpression(expression); | 16 visitConditional(Conditional expression) => visitExpression(expression); |
21 visitConditional(Conditional expression) | |
22 => visitExpression(expression); | |
23 | 17 |
24 visitAccessScope(AccessScope expression) | 18 visitAccessScope(AccessScope expression) => visitExpression(expression); |
25 => visitExpression(expression); | 19 visitAccessMember(AccessMember expression) => visitExpression(expression); |
26 visitAccessMember(AccessMember expression) | 20 visitAccessKeyed(AccessKeyed expression) => visitExpression(expression); |
27 => visitExpression(expression); | |
28 visitAccessKeyed(AccessKeyed expression) | |
29 => visitExpression(expression); | |
30 | 21 |
31 visitCallScope(CallScope expression) | 22 visitCallScope(CallScope expression) => visitExpression(expression); |
32 => visitExpression(expression); | 23 visitCallFunction(CallFunction expression) => visitExpression(expression); |
33 visitCallFunction(CallFunction expression) | 24 visitCallMember(CallMember expression) => visitExpression(expression); |
34 => visitExpression(expression); | |
35 visitCallMember(CallMember expression) | |
36 => visitExpression(expression); | |
37 | 25 |
38 visitBinary(Binary expression) | 26 visitBinary(Binary expression) => visitExpression(expression); |
39 => visitExpression(expression); | |
40 | 27 |
41 visitPrefix(Prefix expression) | 28 visitPrefix(Prefix expression) => visitExpression(expression); |
42 => visitExpression(expression); | |
43 | 29 |
44 visitLiteral(Literal expression) | 30 visitLiteral(Literal expression) => visitExpression(expression); |
45 => visitExpression(expression); | 31 visitLiteralPrimitive(LiteralPrimitive expression) => |
46 visitLiteralPrimitive(LiteralPrimitive expression) | 32 visitLiteral(expression); |
47 => visitLiteral(expression); | 33 visitLiteralString(LiteralString expression) => visitLiteral(expression); |
48 visitLiteralString(LiteralString expression) | 34 visitLiteralArray(LiteralArray expression) => visitLiteral(expression); |
49 => visitLiteral(expression); | 35 visitLiteralObject(LiteralObject expression) => visitLiteral(expression); |
50 visitLiteralArray(LiteralArray expression) | |
51 => visitLiteral(expression); | |
52 visitLiteralObject(LiteralObject expression) | |
53 => visitLiteral(expression); | |
54 } | 36 } |
55 | 37 |
56 abstract class Expression { | 38 abstract class Expression { |
57 bool get isAssignable => false; | 39 bool get isAssignable => false; |
58 bool get isChain => false; | 40 bool get isChain => false; |
59 | 41 |
60 eval(scope, [FilterMap filters = defaultFilterMap]) | 42 eval(scope, [FormatterMap formatters = defaultFormatterMap]) => |
61 => throw new EvalError("Cannot evaluate $this"); | 43 throw new EvalError("Cannot evaluate $this"); |
62 assign(scope, value) | 44 assign(scope, value) => |
63 => throw new EvalError("Cannot assign to $this"); | 45 throw new EvalError("Cannot assign to $this"); |
64 bind(context, [LocalsWrapper wrapper]) | 46 bind(context, [LocalsWrapper wrapper]) => |
65 => new BoundExpression(this, context, wrapper); | 47 new BoundExpression(this, context, wrapper); |
66 | 48 |
67 accept(Visitor visitor); | 49 accept(Visitor visitor); |
68 String toString() => Unparser.unparse(this); | 50 String toString() => Unparser.unparse(this); |
69 } | 51 } |
70 | 52 |
71 class BoundExpression { | 53 class BoundExpression { |
72 final Expression expression; | 54 final Expression expression; |
73 final _context; | 55 final _context; |
74 final LocalsWrapper _wrapper; | 56 final LocalsWrapper _wrapper; |
75 BoundExpression(this.expression, this._context, this._wrapper); | 57 BoundExpression(this.expression, this._context, this._wrapper); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 } | 112 } |
131 | 113 |
132 class AccessKeyed extends Expression { | 114 class AccessKeyed extends Expression { |
133 final Expression object; | 115 final Expression object; |
134 final Expression key; | 116 final Expression key; |
135 AccessKeyed(this.object, this.key); | 117 AccessKeyed(this.object, this.key); |
136 bool get isAssignable => true; | 118 bool get isAssignable => true; |
137 accept(Visitor visitor) => visitor.visitAccessKeyed(this); | 119 accept(Visitor visitor) => visitor.visitAccessKeyed(this); |
138 } | 120 } |
139 | 121 |
| 122 class CallArguments { |
| 123 final List<Expression> positionals; |
| 124 final Map<String, Expression> named; |
| 125 const CallArguments(this.positionals, this.named); |
| 126 |
| 127 int get arity => positionals.length + named.length; |
| 128 |
| 129 Expression operator[](int index) { |
| 130 int split = positionals.length; |
| 131 return index < split ? positionals[index] : named.values.elementAt(index - s
plit); |
| 132 } |
| 133 } |
| 134 |
140 class CallScope extends Expression { | 135 class CallScope extends Expression { |
141 final String name; | 136 final String name; |
142 final List<Expression> arguments; | 137 final CallArguments arguments; |
143 CallScope(this.name, this.arguments); | 138 CallScope(this.name, this.arguments); |
144 accept(Visitor visitor) => visitor.visitCallScope(this); | 139 accept(Visitor visitor) => visitor.visitCallScope(this); |
145 } | 140 } |
146 | 141 |
147 class CallFunction extends Expression { | 142 class CallFunction extends Expression { |
148 final Expression function; | 143 final Expression function; |
149 final List<Expression> arguments; | 144 final CallArguments arguments; |
150 CallFunction(this.function, this.arguments); | 145 CallFunction(this.function, this.arguments); |
151 accept(Visitor visitor) => visitor.visitCallFunction(this); | 146 accept(Visitor visitor) => visitor.visitCallFunction(this); |
152 } | 147 } |
153 | 148 |
154 class CallMember extends Expression { | 149 class CallMember extends Expression { |
155 final Expression object; | 150 final Expression object; |
156 final String name; | 151 final String name; |
157 final List<Expression> arguments; | 152 final CallArguments arguments; |
158 CallMember(this.object, this.name, this.arguments); | 153 CallMember(this.object, this.name, this.arguments); |
159 accept(Visitor visitor) => visitor.visitCallMember(this); | 154 accept(Visitor visitor) => visitor.visitCallMember(this); |
160 } | 155 } |
161 | 156 |
162 class Binary extends Expression { | 157 class Binary extends Expression { |
163 final String operation; | 158 final String operation; |
164 final Expression left; | 159 final Expression left; |
165 final Expression right; | 160 final Expression right; |
166 Binary(this.operation, this.left, this.right); | 161 Binary(this.operation, this.left, this.right); |
167 accept(Visitor visitor) => visitor.visitBinary(this); | 162 accept(Visitor visitor) => visitor.visitBinary(this); |
(...skipping 27 matching lines...) Expand all Loading... |
195 accept(Visitor visitor) => visitor.visitLiteralArray(this); | 190 accept(Visitor visitor) => visitor.visitLiteralArray(this); |
196 } | 191 } |
197 | 192 |
198 class LiteralObject extends Literal { | 193 class LiteralObject extends Literal { |
199 final List<String> keys; | 194 final List<String> keys; |
200 final List<Expression> values; | 195 final List<Expression> values; |
201 LiteralObject(this.keys, this.values); | 196 LiteralObject(this.keys, this.values); |
202 accept(Visitor visitor) => visitor.visitLiteralObject(this); | 197 accept(Visitor visitor) => visitor.visitLiteralObject(this); |
203 } | 198 } |
204 | 199 |
205 const defaultFilterMap = const _DefaultFilterMap(); | 200 const defaultFormatterMap = const _DefaultFormatterMap(); |
206 | 201 |
207 class _DefaultFilterMap implements FilterMap { | 202 class _DefaultFormatterMap implements FormatterMap { |
208 const _DefaultFilterMap(); | 203 const _DefaultFormatterMap(); |
209 | 204 |
210 call(name) => throw 'No NgFilter: $name found!'; | 205 call(name) => throw 'No Formatter: $name found!'; |
211 Type operator[](annotation) => null; | 206 Type operator[](annotation) => null; |
212 forEach(fn) { } | 207 forEach(fn) { } |
213 annotationsFor(type) => null; | 208 annotationsFor(type) => null; |
214 } | 209 } |
OLD | NEW |