Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 063fb0a

Browse files
committed
reflactor(parser): rename DynamicParser into Parser
Since there is only one implementation of the Parser interface, which is used for both dynamic and static deployments, calling it DynamicParser is misleading. - Remove the Parser interface - Rename rename DynamicParser into Parser - Rename DynamicParserBackend into RuntimeParserBackend
1 parent 5ef596d commit 063fb0a

14 files changed

+158
-192
lines changed

bin/parser_generator_for_spec.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ main(arguments) {
1111
Module module = new Module()
1212
..bind(Lexer)
1313
..bind(ParserGetterSetter)
14-
..bind(Parser, toImplementation: DynamicParser)
14+
..bind(Parser)
1515
..install(new CacheModule());
1616
module.bind(ParserBackend, toImplementation: DartGetterSetterGen);
1717
Injector injector = new DynamicInjector(modules: [module],

lib/application_factory_static.dart

-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import 'package:angular/application.dart';
3636
import 'package:angular/core/registry.dart';
3737
import 'package:angular/core/parser/parser.dart';
3838
import 'package:angular/core/parser/parser_static.dart';
39-
import 'package:angular/core/parser/dynamic_parser.dart';
4039
import 'package:angular/core/registry_static.dart';
4140
import 'package:angular/change_detection/change_detection.dart';
4241
import 'package:angular/change_detection/dirty_checking_change_detector_static.dart';

lib/core/module.dart

+1-4
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ export "package:angular/change_detection/watch_group.dart" show
1313
ReactionFn;
1414

1515
export "package:angular/core/parser/parser.dart" show
16-
Parser;
17-
18-
export "package:angular/core/parser/dynamic_parser.dart" show
19-
ClosureMap;
16+
Parser, ClosureMap;
2017

2118
export "package:angular/change_detection/change_detection.dart" show
2219
AvgStopwatch,

lib/core/module_internal.dart

+3-4
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,9 @@ class CoreModule extends Module {
4646
bind(ScopeStatsConfig);
4747
bind(Object, toValue: {}); // RootScope context
4848

49-
bind(Parser, inject: [DynamicParser]);
50-
bind(ParserBackend, inject: [DynamicParserBackend]);
51-
bind(DynamicParser);
52-
bind(DynamicParserBackend);
49+
bind(Parser);
50+
bind(RuntimeParserBackend);
51+
bind(ParserBackend, inject: [RuntimeParserBackend]);
5352
bind(Lexer);
5453
bind(ASTParser);
5554
}

lib/core/parser/dynamic_parser.dart

-142
This file was deleted.

lib/core/parser/dynamic_parser_impl.dart renamed to lib/core/parser/parse_expression.dart

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
1-
library angular.core.parser.dynamic_parser_impl;
1+
library angular.core.parser.parse_expression;
22

33
import 'package:angular/core/parser/parser.dart' show ParserBackend;
44
import 'package:angular/core/parser/lexer.dart';
55
import 'package:angular/core/parser/syntax.dart';
66
import 'package:angular/core/parser/characters.dart';
77
import 'package:angular/utils.dart' show isReservedWord;
88

9-
class DynamicParserImpl {
9+
Expression parseExpression(Lexer lexer, ParserBackend backend, String input) =>
10+
new _ParseExpression(lexer, backend, input).parseChain();
11+
12+
class _ParseExpression {
1013
final ParserBackend backend;
1114
final String input;
1215
final List<Token> tokens;
1316
int index = 0;
1417

15-
DynamicParserImpl(Lexer lexer, this.backend, String input)
18+
_ParseExpression(Lexer lexer, this.backend, String input)
1619
: this.input = input, tokens = lexer.call(input);
1720

1821
Token get next => peek(0);

lib/core/parser/parser.dart

+136-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
library angular.core.parser;
22

3-
import 'package:angular/core/parser/syntax.dart'
4-
show CallArguments;
3+
import 'package:angular/core/parser/syntax.dart' show defaultFormatterMap, Expression, Visitor;
4+
import 'package:angular/core/parser/eval.dart';
5+
import 'package:angular/core/parser/utils.dart' show EvalError;
6+
import 'package:angular/cache/module.dart';
7+
import 'package:angular/core/annotation_src.dart' hide Formatter;
8+
import 'package:angular/core/module_internal.dart' show FormatterMap;
9+
import 'package:angular/core/parser/lexer.dart';
10+
import 'package:angular/core/parser/parse_expression.dart';
11+
import 'package:angular/utils.dart';
12+
513
export 'package:angular/core/parser/syntax.dart'
6-
show Visitor, Expression, BoundExpression, CallArguments;
7-
export 'package:angular/core/parser/dynamic_parser.dart'
8-
show DynamicParser, DynamicParserBackend, ClosureMap;
14+
show Visitor, Expression, BoundExpression, CallArguments;
915

1016
typedef LocalsWrapper(context, locals);
1117
typedef Getter(self);
@@ -14,9 +20,11 @@ typedef BoundGetter([locals]);
1420
typedef BoundSetter(value, [locals]);
1521
typedef MethodClosure(obj, List posArgs, Map namedArgs);
1622

17-
/// Placeholder for DI. The parser you are looking for is [DynamicParser].
18-
abstract class Parser<T> {
19-
T call(String input);
23+
abstract class ClosureMap {
24+
Getter lookupGetter(String name);
25+
Setter lookupSetter(String name);
26+
Symbol lookupSymbol(String name);
27+
MethodClosure lookupFunction(String name, CallArguments arguments);
2028
}
2129

2230
abstract class ParserBackend<T> {
@@ -67,3 +75,123 @@ abstract class ParserBackend<T> {
6775
T newLiteralNumber(num value) => newLiteralPrimitive(value);
6876
T newLiteralString(String value) => null;
6977
}
78+
79+
@Injectable()
80+
class Parser {
81+
final Lexer _lexer;
82+
final ParserBackend _backend;
83+
final Map<String, Expression> _cache = {};
84+
Parser(this._lexer, this._backend, CacheRegister cacheRegister) {
85+
cacheRegister.registerCache("Parser", _cache);
86+
}
87+
88+
Expression call(String input) {
89+
if (input == null) input = '';
90+
return _cache.putIfAbsent(input, () => _parse(input));
91+
}
92+
93+
Expression _parse(String input) {
94+
Expression expression = parseExpression(_lexer, _backend, input);
95+
return new _UnwrapExceptionDecorator(expression);
96+
}
97+
}
98+
99+
class _UnwrapExceptionDecorator extends Expression {
100+
final Expression _expression;
101+
_UnwrapExceptionDecorator (this._expression);
102+
103+
bool get isAssignable => _expression.isAssignable;
104+
bool get isChain => _expression.isChain;
105+
106+
accept(Visitor visitor) => _expression.accept(visitor);
107+
toString() => _expression.toString();
108+
109+
eval(scope, [FormatterMap formatters = defaultFormatterMap]) {
110+
try {
111+
return _expression.eval(scope, formatters);
112+
} on EvalError catch (e, s) {
113+
throw e.unwrap("$this", s);
114+
}
115+
}
116+
117+
assign(scope, value) {
118+
try {
119+
return _expression.assign(scope, value);
120+
} on EvalError catch (e, s) {
121+
throw e.unwrap("$this", s);
122+
}
123+
}
124+
}
125+
126+
@Injectable()
127+
class RuntimeParserBackend extends ParserBackend {
128+
final ClosureMap _closures;
129+
RuntimeParserBackend(this._closures);
130+
131+
bool isAssignable(Expression expression) => expression.isAssignable;
132+
133+
Expression newFormatter(expression, name, arguments) {
134+
List allArguments = new List(arguments.length + 1);
135+
allArguments[0] = expression;
136+
allArguments.setAll(1, arguments);
137+
return new Formatter(expression, name, arguments, allArguments);
138+
}
139+
140+
Expression newChain(expressions) => new Chain(expressions);
141+
Expression newAssign(target, value) => new Assign(target, value);
142+
Expression newConditional(condition, yes, no) =>
143+
new Conditional(condition, yes, no);
144+
145+
Expression newAccessKeyed(object, key) => new AccessKeyed(object, key);
146+
Expression newCallFunction(function, arguments) =>
147+
new CallFunction(function, _closures, arguments);
148+
149+
Expression newPrefixNot(expression) => new PrefixNot(expression);
150+
151+
Expression newBinary(operation, left, right) =>
152+
new Binary(operation, left, right);
153+
154+
Expression newLiteralPrimitive(value) => new LiteralPrimitive(value);
155+
Expression newLiteralArray(elements) => new LiteralArray(elements);
156+
Expression newLiteralObject(keys, values) => new LiteralObject(keys, values);
157+
Expression newLiteralString(value) => new LiteralString(value);
158+
159+
Expression newAccessScope(name) {
160+
Getter getter;
161+
Setter setter;
162+
if (name == 'this') {
163+
getter = (o) => o;
164+
} else {
165+
_assertNotReserved(name);
166+
getter = _closures.lookupGetter(name);
167+
setter = _closures.lookupSetter(name);
168+
}
169+
return new AccessScopeFast(name, getter, setter);
170+
}
171+
172+
Expression newAccessMember(object, name) {
173+
_assertNotReserved(name);
174+
Getter getter = _closures.lookupGetter(name);
175+
Setter setter = _closures.lookupSetter(name);
176+
return new AccessMemberFast(object, name, getter, setter);
177+
}
178+
179+
Expression newCallScope(name, arguments) {
180+
_assertNotReserved(name);
181+
MethodClosure function = _closures.lookupFunction(name, arguments);
182+
return new CallScope(name, function, arguments);
183+
}
184+
185+
Expression newCallMember(object, name, arguments) {
186+
_assertNotReserved(name);
187+
MethodClosure function = _closures.lookupFunction(name, arguments);
188+
return new CallMember(object, function, name, arguments);
189+
}
190+
191+
_assertNotReserved(name) {
192+
if (isReservedWord(name)) {
193+
throw "Identifier '$name' is a reserved word.";
194+
}
195+
}
196+
}
197+

lib/tools/expression_extractor.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,9 @@ main(args) {
5656
Module module = new Module()
5757
..bind(ParserGetterSetter)
5858
..bind(Lexer)
59-
..bind(DynamicParser)
6059
..bind(DartGetterSetterGen)
6160
..bind(CacheRegister)
62-
..bind(Parser, inject: [DynamicParser])
61+
..bind(Parser)
6362
..bind(ParserBackend, inject: [DartGetterSetterGen]);
6463
Injector injector = new DynamicInjector(modules: [module]);
6564

lib/tools/transformer/expression_generator.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class ExpressionGenerator extends Transformer with ResolverTransformer {
4646
.forEach(htmlExtractor.parseHtml)
4747
.then((_) {
4848
var module = new Module()
49-
..bind(Parser, inject: const [DynamicParser])
49+
..bind(Parser)
5050
..bind(ParserBackend, inject: const [DartGetterSetterGen]);
5151
var injector =
5252
new DynamicInjector(modules: [module], allowImplicitInjection: true);

0 commit comments

Comments
 (0)