@@ -5,6 +5,7 @@ import 'dart:collection';
5
5
import 'package:angular/core/parser/syntax.dart' as syntax;
6
6
import 'package:angular/core/parser/parser.dart' ;
7
7
import 'package:angular/core/formatter.dart' ;
8
+ import 'package:angular/core/annotation_src.dart' ;
8
9
import 'package:angular/change_detection/watch_group.dart' ;
9
10
import 'package:angular/change_detection/change_detection.dart' ;
10
11
import 'package:angular/core/parser/utils.dart' ;
@@ -18,48 +19,29 @@ class _FunctionChain {
18
19
}
19
20
}
20
21
21
- class AstParser {
22
+ @Injectable ()
23
+ class ASTParser {
22
24
final Parser _parser;
23
- int _id = 0 ;
24
- final ExpressionVisitor _visitor;
25
+ final ClosureMap _closureMap;
25
26
26
- AstParser (this ._parser, ClosureMap closureMap)
27
- : _visitor = new ExpressionVisitor (closureMap);
27
+ ASTParser (this ._parser, this ._closureMap);
28
28
29
29
AST call (String input, {FormatterMap formatters,
30
30
bool collection: false }) {
31
- _visitor.formatters = formatters;
32
- AST contextRef = _visitor.contextRef;
33
- try {
34
- var exp = _parser (input);
35
- return collection ? _visitor.visitCollection (exp) : _visitor.visit (exp);
36
- } finally {
37
- _visitor.contextRef = contextRef;
38
- _visitor.formatters = null ;
39
- }
31
+ var visitor = new _ExpressionVisitor (_closureMap, formatters);
32
+ var exp = _parser (input);
33
+ return collection ? visitor.visitCollection (exp) : visitor.visit (exp);
40
34
}
41
35
}
42
36
43
- class ExpressionVisitor implements syntax.Visitor {
44
- static final ContextReferenceAST scopeContextRef = new ContextReferenceAST ();
37
+ class _ExpressionVisitor implements syntax.Visitor {
38
+ static final ContextReferenceAST contextRef = new ContextReferenceAST ();
45
39
final ClosureMap _closureMap;
46
- AST contextRef = scopeContextRef;
47
-
40
+ final FormatterMap _formatters;
48
41
49
- ExpressionVisitor (this ._closureMap);
42
+ _ExpressionVisitor (this ._closureMap, this ._formatters );
50
43
51
- AST ast;
52
- FormatterMap formatters;
53
-
54
- AST visit (syntax.Expression exp) {
55
- exp.accept (this );
56
- assert (ast != null );
57
- try {
58
- return ast;
59
- } finally {
60
- ast = null ;
61
- }
62
- }
44
+ AST visit (syntax.Expression exp) => exp.accept (this );
63
45
64
46
AST visitCollection (syntax.Expression exp) => new CollectionAST (visit (exp));
65
47
AST _mapToAst (syntax.Expression expression) => visit (expression);
@@ -76,71 +58,71 @@ class ExpressionVisitor implements syntax.Visitor {
76
58
return result;
77
59
}
78
60
79
- void visitCallScope (syntax.CallScope exp) {
61
+ AST visitCallScope (syntax.CallScope exp) {
80
62
List <AST > positionals = _toAst (exp.arguments.positionals);
81
63
Map <Symbol , AST > named = _toAstMap (exp.arguments.named);
82
- ast = new MethodAST (contextRef, exp.name, positionals, named);
64
+ return new MethodAST (contextRef, exp.name, positionals, named);
83
65
}
84
- void visitCallMember (syntax.CallMember exp) {
66
+ AST visitCallMember (syntax.CallMember exp) {
85
67
List <AST > positionals = _toAst (exp.arguments.positionals);
86
68
Map <Symbol , AST > named = _toAstMap (exp.arguments.named);
87
- ast = new MethodAST (visit (exp.object), exp.name, positionals, named);
88
- }
89
- void visitAccessScope (syntax.AccessScope exp) {
90
- ast = new FieldReadAST (contextRef, exp.name);
91
- }
92
- void visitAccessMember (syntax.AccessMember exp) {
93
- ast = new FieldReadAST (visit (exp.object), exp.name);
94
- }
95
- void visitBinary (syntax.Binary exp) {
96
- ast = new PureFunctionAST (exp.operation,
97
- _operationToFunction (exp.operation),
98
- [visit (exp.left), visit (exp.right)]);
99
- }
100
- void visitPrefix (syntax.Prefix exp) {
101
- ast = new PureFunctionAST (exp.operation,
102
- _operationToFunction (exp.operation),
103
- [visit (exp.expression)]);
104
- }
105
- void visitConditional (syntax.Conditional exp) {
106
- ast = new PureFunctionAST ('?:' , _operation_ternary,
107
- [visit (exp.condition), visit (exp.yes),
108
- visit (exp.no)]);
69
+ return new MethodAST (visit (exp.object), exp.name, positionals, named);
109
70
}
110
- void visitAccessKeyed (syntax.AccessKeyed exp) {
111
- ast = new ClosureAST ('[]' , _operation_bracket,
112
- [visit (exp.object), visit (exp.key)]);
113
- }
114
- void visitLiteralPrimitive (syntax.LiteralPrimitive exp) {
115
- ast = new ConstantAST (exp.value);
116
- }
117
- void visitLiteralString (syntax.LiteralString exp) {
118
- ast = new ConstantAST (exp.value);
119
- }
120
- void visitLiteralArray (syntax.LiteralArray exp) {
71
+ AST visitAccessScope (syntax.AccessScope exp) =>
72
+ new FieldReadAST (contextRef, exp.name);
73
+
74
+ AST visitAccessMember (syntax.AccessMember exp) =>
75
+ new FieldReadAST (visit (exp.object), exp.name);
76
+
77
+ AST visitBinary (syntax.Binary exp) =>
78
+ new PureFunctionAST (exp.operation,
79
+ _operationToFunction (exp.operation),
80
+ [visit (exp.left), visit (exp.right)]);
81
+
82
+ AST visitPrefix (syntax.Prefix exp) =>
83
+ new PureFunctionAST (exp.operation,
84
+ _operationToFunction (exp.operation),
85
+ [visit (exp.expression)]);
86
+
87
+ AST visitConditional (syntax.Conditional exp) =>
88
+ new PureFunctionAST ('?:' , _operation_ternary,
89
+ [visit (exp.condition), visit (exp.yes),
90
+ visit (exp.no)]);
91
+
92
+ AST visitAccessKeyed (syntax.AccessKeyed exp) =>
93
+ new ClosureAST ('[]' , _operation_bracket,
94
+ [visit (exp.object), visit (exp.key)]);
95
+
96
+ AST visitLiteralPrimitive (syntax.LiteralPrimitive exp) =>
97
+ new ConstantAST (exp.value);
98
+
99
+ AST visitLiteralString (syntax.LiteralString exp) =>
100
+ new ConstantAST (exp.value);
101
+
102
+ AST visitLiteralArray (syntax.LiteralArray exp) {
121
103
List <AST > items = _toAst (exp.elements);
122
- ast = new PureFunctionAST ('[${items .join (', ' )}]' , new ArrayFn (), items);
104
+ return new PureFunctionAST ('[${items .join (', ' )}]' , new ArrayFn (), items);
123
105
}
124
106
125
- void visitLiteralObject (syntax.LiteralObject exp) {
107
+ AST visitLiteralObject (syntax.LiteralObject exp) {
126
108
List <String > keys = exp.keys;
127
109
List <AST > values = _toAst (exp.values);
128
110
assert (keys.length == values.length);
129
111
var kv = < String > [];
130
112
for (var i = 0 ; i < keys.length; i++ ) {
131
113
kv.add ('${keys [i ]}: ${values [i ]}' );
132
114
}
133
- ast = new PureFunctionAST ('{${kv .join (', ' )}}' , new MapFn (keys), values);
115
+ return new PureFunctionAST ('{${kv .join (', ' )}}' , new MapFn (keys), values);
134
116
}
135
117
136
- void visitFormatter (syntax.Formatter exp) {
137
- if (formatters == null ) {
118
+ AST visitFormatter (syntax.Formatter exp) {
119
+ if (_formatters == null ) {
138
120
throw new Exception ("No formatters have been registered" );
139
121
}
140
- Function formatterFunction = formatters (exp.name);
122
+ Function formatterFunction = _formatters (exp.name);
141
123
List <AST > args = [visitCollection (exp.expression)];
142
124
args.addAll (_toAst (exp.arguments).map ((ast) => new CollectionAST (ast)));
143
- ast = new PureFunctionAST ('|${exp .name }' ,
125
+ return new PureFunctionAST ('|${exp .name }' ,
144
126
new _FormatterWrapper (formatterFunction, args.length), args);
145
127
}
146
128
0 commit comments