Skip to content

Commit f39e7d9

Browse files
committed
chore(ASTParser): Clean up and refactor the ASTParser
-> Make it injectable -> Remove try/catch statements are extra state -> Rename AstParser -> ASTParser -> Rename ExpressionVisitor -> _ExpressionVisitor For dart-archive#1086
1 parent 9bf25bc commit f39e7d9

File tree

4 files changed

+50
-66
lines changed

4 files changed

+50
-66
lines changed

lib/change_detection/ast_parser.dart

Lines changed: 41 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'dart:collection';
55
import 'package:angular/core/parser/syntax.dart' as syntax;
66
import 'package:angular/core/parser/parser.dart';
77
import 'package:angular/core/formatter.dart';
8+
import 'package:angular/core/annotation_src.dart';
89
import 'package:angular/change_detection/watch_group.dart';
910
import 'package:angular/change_detection/change_detection.dart';
1011
import 'package:angular/core/parser/utils.dart';
@@ -18,48 +19,30 @@ class _FunctionChain {
1819
}
1920
}
2021

21-
class AstParser {
22+
@Injectable()
23+
class ASTParser {
2224
final Parser _parser;
23-
int _id = 0;
24-
final ExpressionVisitor _visitor;
25+
final ClosureMap _closureMap;
2526

26-
AstParser(this._parser, ClosureMap closureMap)
27-
: _visitor = new ExpressionVisitor(closureMap);
27+
ASTParser(this._parser, ClosureMap this._closureMap);
2828

2929
AST call(String input, {FormatterMap formatters,
3030
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);
4034
}
4135
}
4236

43-
class ExpressionVisitor implements syntax.Visitor {
37+
class _ExpressionVisitor implements syntax.Visitor {
4438
static final ContextReferenceAST scopeContextRef = new ContextReferenceAST();
4539
final ClosureMap _closureMap;
46-
AST contextRef = scopeContextRef;
47-
40+
final AST contextRef = scopeContextRef;
41+
final FormatterMap _formatters;
4842

49-
ExpressionVisitor(this._closureMap);
43+
_ExpressionVisitor(this._closureMap, this._formatters);
5044

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-
}
45+
AST visit(syntax.Expression exp) => exp.accept(this);
6346

6447
AST visitCollection(syntax.Expression exp) => new CollectionAST(visit(exp));
6548
AST _mapToAst(syntax.Expression expression) => visit(expression);
@@ -76,71 +59,71 @@ class ExpressionVisitor implements syntax.Visitor {
7659
return result;
7760
}
7861

79-
void visitCallScope(syntax.CallScope exp) {
62+
AST visitCallScope(syntax.CallScope exp) {
8063
List<AST> positionals = _toAst(exp.arguments.positionals);
8164
Map<Symbol, AST> named = _toAstMap(exp.arguments.named);
82-
ast = new MethodAST(contextRef, exp.name, positionals, named);
65+
return new MethodAST(contextRef, exp.name, positionals, named);
8366
}
84-
void visitCallMember(syntax.CallMember exp) {
67+
AST visitCallMember(syntax.CallMember exp) {
8568
List<AST> positionals = _toAst(exp.arguments.positionals);
8669
Map<Symbol, AST> named = _toAstMap(exp.arguments.named);
87-
ast = new MethodAST(visit(exp.object), exp.name, positionals, named);
70+
return new MethodAST(visit(exp.object), exp.name, positionals, named);
8871
}
89-
void visitAccessScope(syntax.AccessScope exp) {
90-
ast = new FieldReadAST(contextRef, exp.name);
72+
AST visitAccessScope(syntax.AccessScope exp) {
73+
return new FieldReadAST(contextRef, exp.name);
9174
}
92-
void visitAccessMember(syntax.AccessMember exp) {
93-
ast = new FieldReadAST(visit(exp.object), exp.name);
75+
AST visitAccessMember(syntax.AccessMember exp) {
76+
return new FieldReadAST(visit(exp.object), exp.name);
9477
}
95-
void visitBinary(syntax.Binary exp) {
96-
ast = new PureFunctionAST(exp.operation,
78+
AST visitBinary(syntax.Binary exp) {
79+
return new PureFunctionAST(exp.operation,
9780
_operationToFunction(exp.operation),
9881
[visit(exp.left), visit(exp.right)]);
9982
}
100-
void visitPrefix(syntax.Prefix exp) {
101-
ast = new PureFunctionAST(exp.operation,
83+
AST visitPrefix(syntax.Prefix exp) {
84+
return new PureFunctionAST(exp.operation,
10285
_operationToFunction(exp.operation),
10386
[visit(exp.expression)]);
10487
}
105-
void visitConditional(syntax.Conditional exp) {
106-
ast = new PureFunctionAST('?:', _operation_ternary,
88+
AST visitConditional(syntax.Conditional exp) {
89+
return new PureFunctionAST('?:', _operation_ternary,
10790
[visit(exp.condition), visit(exp.yes),
10891
visit(exp.no)]);
10992
}
110-
void visitAccessKeyed(syntax.AccessKeyed exp) {
111-
ast = new ClosureAST('[]', _operation_bracket,
93+
AST visitAccessKeyed(syntax.AccessKeyed exp) {
94+
return new ClosureAST('[]', _operation_bracket,
11295
[visit(exp.object), visit(exp.key)]);
11396
}
114-
void visitLiteralPrimitive(syntax.LiteralPrimitive exp) {
115-
ast = new ConstantAST(exp.value);
97+
AST visitLiteralPrimitive(syntax.LiteralPrimitive exp) {
98+
return new ConstantAST(exp.value);
11699
}
117-
void visitLiteralString(syntax.LiteralString exp) {
118-
ast = new ConstantAST(exp.value);
100+
AST visitLiteralString(syntax.LiteralString exp) {
101+
return new ConstantAST(exp.value);
119102
}
120-
void visitLiteralArray(syntax.LiteralArray exp) {
103+
AST visitLiteralArray(syntax.LiteralArray exp) {
121104
List<AST> items = _toAst(exp.elements);
122-
ast = new PureFunctionAST('[${items.join(', ')}]', new ArrayFn(), items);
105+
return new PureFunctionAST('[${items.join(', ')}]', new ArrayFn(), items);
123106
}
124107

125-
void visitLiteralObject(syntax.LiteralObject exp) {
108+
AST visitLiteralObject(syntax.LiteralObject exp) {
126109
List<String> keys = exp.keys;
127110
List<AST> values = _toAst(exp.values);
128111
assert(keys.length == values.length);
129112
var kv = <String>[];
130113
for (var i = 0; i < keys.length; i++) {
131114
kv.add('${keys[i]}: ${values[i]}');
132115
}
133-
ast = new PureFunctionAST('{${kv.join(', ')}}', new MapFn(keys), values);
116+
return new PureFunctionAST('{${kv.join(', ')}}', new MapFn(keys), values);
134117
}
135118

136-
void visitFormatter(syntax.Formatter exp) {
137-
if (formatters == null) {
119+
AST visitFormatter(syntax.Formatter exp) {
120+
if (_formatters == null) {
138121
throw new Exception("No formatters have been registered");
139122
}
140-
Function formatterFunction = formatters(exp.name);
123+
Function formatterFunction = _formatters(exp.name);
141124
List<AST> args = [visitCollection(exp.expression)];
142125
args.addAll(_toAst(exp.arguments).map((ast) => new CollectionAST(ast)));
143-
ast = new PureFunctionAST('|${exp.name}',
126+
return new PureFunctionAST('|${exp.name}',
144127
new _FormatterWrapper(formatterFunction, args.length), args);
145128
}
146129

lib/core/module_internal.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,6 @@ class CoreModule extends Module {
5454
bind(DynamicParser);
5555
bind(DynamicParserBackend);
5656
bind(Lexer);
57+
bind(ASTParser);
5758
}
5859
}

lib/core/scope.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ class RootScope extends Scope {
555555
static final STATE_FLUSH_ASSERT = 'assert';
556556

557557
final ExceptionHandler _exceptionHandler;
558-
final AstParser _astParser;
558+
final ASTParser _astParser;
559559
final Parser _parser;
560560
final ScopeDigestTTL _ttl;
561561
final VmTurnZone _zone;
@@ -617,12 +617,12 @@ class RootScope extends Scope {
617617
*/
618618
String get state => _state;
619619

620-
RootScope(Object context, Parser parser, FieldGetterFactory fieldGetterFactory,
620+
RootScope(Object context, Parser parser, ASTParser astParser, FieldGetterFactory fieldGetterFactory,
621621
FormatterMap formatters, this._exceptionHandler, this._ttl, this._zone,
622-
ScopeStats _scopeStats, ClosureMap closureMap)
622+
ScopeStats _scopeStats)
623623
: _scopeStats = _scopeStats,
624624
_parser = parser,
625-
_astParser = new AstParser(parser, closureMap),
625+
_astParser = astParser,
626626
super(context, null, null,
627627
new RootWatchGroup(fieldGetterFactory,
628628
new DirtyCheckingChangeDetector(fieldGetterFactory), context),

test/change_detection/watch_group_spec.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,19 @@ void main() {
2121
DirtyCheckingChangeDetector changeDetector;
2222
Logger logger;
2323
Parser parser;
24-
ExpressionVisitor visitor;
24+
ASTParser astParser;
2525

26-
beforeEach(inject((Logger _logger, Parser _parser) {
26+
beforeEach(inject((Logger _logger, Parser _parser, ASTParser _astParser) {
2727
context = {};
2828
var getterFactory = new DynamicFieldGetterFactory();
2929
changeDetector = new DirtyCheckingChangeDetector(getterFactory);
3030
watchGrp = new RootWatchGroup(getterFactory, changeDetector, context);
31-
visitor = new ExpressionVisitor(new DynamicClosureMap());
3231
logger = _logger;
3332
parser = _parser;
33+
astParser = _astParser;
3434
}));
3535

36-
AST parse(String expression) => visitor.visit(parser(expression));
36+
AST parse(String expression) => astParser(expression);
3737

3838
eval(String expression, [evalContext]) {
3939
AST ast = parse(expression);

0 commit comments

Comments
 (0)