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

Commit 271ecec

Browse files
kasperlmhevery
authored andcommitted
fix(dynamic_parser): Handle reserved words correctly
Closes #614
1 parent 9e795c4 commit 271ecec

File tree

13 files changed

+339
-29
lines changed

13 files changed

+339
-29
lines changed

bin/parser_generator_for_spec.dart

+199-1
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,204 @@ main(arguments) {
227227
"_privateField",
228228
"'World'|hello",
229229
"1;'World'|hello",
230-
"'World'|hello;1"
230+
"'World'|hello;1",
231+
232+
"assert",
233+
"break",
234+
"case",
235+
"catch",
236+
"class",
237+
"const",
238+
"continue",
239+
"default",
240+
"do",
241+
"else",
242+
"enum",
243+
"extends",
244+
"final",
245+
"finally",
246+
"for",
247+
"if",
248+
"in",
249+
"is",
250+
"new",
251+
"rethrow",
252+
"return",
253+
"super",
254+
"switch",
255+
"this",
256+
"throw",
257+
"try",
258+
"var",
259+
"void",
260+
"while",
261+
"with",
262+
263+
"assert = 42",
264+
"break = 42",
265+
"case = 42",
266+
"catch = 42",
267+
"class = 42",
268+
"const = 42",
269+
"continue = 42",
270+
"default = 42",
271+
"do = 42",
272+
"else = 42",
273+
"enum = 42",
274+
"extends = 42",
275+
"false = 42",
276+
"final = 42",
277+
"finally = 42",
278+
"for = 42",
279+
"if = 42",
280+
"in = 42",
281+
"is = 42",
282+
"new = 42",
283+
"null = 42",
284+
"rethrow = 42",
285+
"return = 42",
286+
"super = 42",
287+
"switch = 42",
288+
"this = 42",
289+
"throw = 42",
290+
"true = 42",
291+
"try = 42",
292+
"var = 42",
293+
"void = 42",
294+
"while = 42",
295+
"with = 42",
296+
297+
"assert()",
298+
"break()",
299+
"case()",
300+
"catch()",
301+
"class()",
302+
"const()",
303+
"continue()",
304+
"default()",
305+
"do()",
306+
"else()",
307+
"enum()",
308+
"extends()",
309+
"final()",
310+
"finally()",
311+
"for()",
312+
"if()",
313+
"in()",
314+
"is()",
315+
"new()",
316+
"rethrow()",
317+
"return()",
318+
"super()",
319+
"switch()",
320+
"this()",
321+
"throw()",
322+
"try()",
323+
"var()",
324+
"void()",
325+
"while()",
326+
"with()",
327+
328+
"o.assert",
329+
"o.break",
330+
"o.case",
331+
"o.catch",
332+
"o.class",
333+
"o.const",
334+
"o.continue",
335+
"o.default",
336+
"o.do",
337+
"o.else",
338+
"o.enum",
339+
"o.extends",
340+
"o.false",
341+
"o.final",
342+
"o.finally",
343+
"o.for",
344+
"o.if",
345+
"o.in",
346+
"o.is",
347+
"o.new",
348+
"o.null",
349+
"o.rethrow",
350+
"o.return",
351+
"o.super",
352+
"o.switch",
353+
"o.this",
354+
"o.throw",
355+
"o.true",
356+
"o.try",
357+
"o.var",
358+
"o.void",
359+
"o.while",
360+
"o.with",
361+
362+
"o.assert = 42",
363+
"o.break = 42",
364+
"o.case = 42",
365+
"o.catch = 42",
366+
"o.class = 42",
367+
"o.const = 42",
368+
"o.continue = 42",
369+
"o.default = 42",
370+
"o.do = 42",
371+
"o.else = 42",
372+
"o.enum = 42",
373+
"o.extends = 42",
374+
"o.false = 42",
375+
"o.final = 42",
376+
"o.finally = 42",
377+
"o.for = 42",
378+
"o.if = 42",
379+
"o.in = 42",
380+
"o.is = 42",
381+
"o.new = 42",
382+
"o.null = 42",
383+
"o.rethrow = 42",
384+
"o.return = 42",
385+
"o.super = 42",
386+
"o.switch = 42",
387+
"o.this = 42",
388+
"o.throw = 42",
389+
"o.true = 42",
390+
"o.try = 42",
391+
"o.var = 42",
392+
"o.void = 42",
393+
"o.while = 42",
394+
"o.with = 42",
395+
396+
"o.assert()",
397+
"o.break()",
398+
"o.case()",
399+
"o.catch()",
400+
"o.class()",
401+
"o.const()",
402+
"o.continue()",
403+
"o.default()",
404+
"o.do()",
405+
"o.else()",
406+
"o.enum()",
407+
"o.extends()",
408+
"o.false()",
409+
"o.final()",
410+
"o.finally()",
411+
"o.for()",
412+
"o.if()",
413+
"o.in()",
414+
"o.is()",
415+
"o.new()",
416+
"o.null()",
417+
"o.rethrow()",
418+
"o.return()",
419+
"o.super()",
420+
"o.switch()",
421+
"o.this()",
422+
"o.throw()",
423+
"o.true()",
424+
"o.try()",
425+
"o.var()",
426+
"o.void()",
427+
"o.while()",
428+
"o.with()",
231429
]);
232430
}

lib/core/parser/eval_access.dart

+6-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:angular/core/module.dart';
88

99
class AccessScope extends syntax.AccessScope with AccessReflective {
1010
final Symbol symbol;
11-
AccessScope(String name) : super(name), symbol = new Symbol(name);
11+
AccessScope(String name) : super(name), symbol = newSymbol(name);
1212
eval(scope, [FilterMap filters]) => _eval(scope);
1313
assign(scope, value) => _assign(scope, scope, value);
1414
}
@@ -24,7 +24,7 @@ class AccessScopeFast extends syntax.AccessScope with AccessFast {
2424
class AccessMember extends syntax.AccessMember with AccessReflective {
2525
final Symbol symbol;
2626
AccessMember(object, String name)
27-
: super(object, name), symbol = new Symbol(name);
27+
: super(object, name), symbol = newSymbol(name);
2828
eval(scope, [FilterMap filters]) => _eval(object.eval(scope, filters));
2929
assign(scope, value) => _assign(scope, object.eval(scope), value);
3030
_assignToNonExisting(scope, value) => object.assign(scope, { name: value });
@@ -84,6 +84,9 @@ abstract class AccessReflective {
8484
_cachedKind = CACHED_MAP;
8585
_cachedValue = null;
8686
return holder[name];
87+
} else if (symbol == null) {
88+
_cachedHolder = UNINITIALIZED;
89+
return null;
8790
}
8891
InstanceMirror mirror = reflect(holder);
8992
try {
@@ -119,7 +122,7 @@ abstract class AccessReflective {
119122
holder[name] = value;
120123
} else if (holder == null) {
121124
_assignToNonExisting(scope, value);
122-
} else {
125+
} else if (symbol != null) {
123126
reflect(holder).setField(symbol, value);
124127
}
125128
return value;

lib/core/parser/eval_calls.dart

+5-2
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ class CallScope extends syntax.CallScope with CallReflective {
99
final Symbol symbol;
1010
CallScope(name, arguments)
1111
: super(name, arguments)
12-
, symbol = new Symbol(name);
12+
, symbol = newSymbol(name);
1313
eval(scope, [FilterMap filters]) => _eval(scope, scope);
1414
}
1515

1616
class CallMember extends syntax.CallMember with CallReflective {
1717
final Symbol symbol;
1818
CallMember(object, name, arguments)
1919
: super(object, name, arguments)
20-
, symbol = new Symbol(name);
20+
, symbol = newSymbol(name);
2121
eval(scope, [FilterMap filters]) => _eval(scope, object.eval(scope, filters));
2222
}
2323

@@ -94,6 +94,9 @@ abstract class CallReflective {
9494
_cachedKind = CACHED_MAP;
9595
_cachedValue = null;
9696
return relaxFnApply(ensureFunctionFromMap(holder, name), arguments);
97+
} else if (symbol == null) {
98+
_cachedHolder = UNINITIALIZED;
99+
throw new EvalError("Undefined function $name");
97100
} else {
98101
InstanceMirror mirror = reflect(holder);
99102
_cachedKind = CACHED_FUNCTION;

lib/core/parser/utils.dart

+7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ library angular.core.parser.utils;
22

33
import 'package:angular/core/parser/syntax.dart' show Expression;
44
import 'package:angular/core/module.dart';
5+
import 'package:angular/utils.dart' show isReservedWord;
56
export 'package:angular/utils.dart' show relaxFnApply, relaxFnArgs, toBool;
67

78
/// Marker for an uninitialized value.
@@ -96,3 +97,9 @@ setKeyed(object, key, value) {
9697
}
9798
return value;
9899
}
100+
101+
/// Returns a new symbol with the given name if the name is a legal
102+
/// symbol name. Otherwise, returns null.
103+
Symbol newSymbol(String name) {
104+
return isReservedWord(name) ? null : new Symbol(name);
105+
}

lib/core_dom/module.dart

-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import 'package:perf_api/perf_api.dart';
1010

1111
import 'package:angular/core/module.dart';
1212
import 'package:angular/core/parser/parser.dart';
13-
import 'package:angular/utils.dart';
1413

1514
part 'block.dart';
1615
part 'block_factory.dart';

lib/directive/ng_pluralize.dart

+13-3
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,16 @@ class NgPluralizeDirective {
9696
int offset;
9797
var discreteRules = <String, String>{};
9898
var categoryRules = <Symbol, String>{};
99+
99100
static final RegExp IS_WHEN = new RegExp(r'^when-(minus-)?.');
101+
static const Map<String, Symbol> SYMBOLS = const {
102+
'zero' : #zero,
103+
'one' : #one,
104+
'two' : #two,
105+
'few' : #few,
106+
'many' : #many,
107+
'other' : #other,
108+
};
100109

101110
NgPluralizeDirective(this.scope, this.element, this.interpolate,
102111
NodeAttrs attributes, this.parser) {
@@ -116,10 +125,11 @@ class NgPluralizeDirective {
116125
}
117126

118127
whens.forEach((k, v) {
119-
if (['zero', 'one', 'two', 'few', 'many', 'other'].contains(k)) {
120-
this.categoryRules[new Symbol(k.toString())] = v;
128+
Symbol symbol = SYMBOLS[k];
129+
if (symbol != null) {
130+
this.categoryRules[symbol] = v;
121131
} else {
122-
this.discreteRules[k.toString()] = v;
132+
this.discreteRules[k] = v;
123133
}
124134
});
125135
}

lib/tools/parser_generator/dart_code_gen.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
library dart_code_gen;
22

3-
import 'package:angular/tools/reserved_dart_keywords.dart';
3+
import 'package:angular/utils.dart' show isReservedWord;
44
import 'package:angular/core/parser/syntax.dart';
55

66
escape(String s) => s.replaceAllMapped(new RegExp(r'(\"|\$|\n)'), (m) {
@@ -229,7 +229,7 @@ class HelperMap {
229229
String lookup(String key) {
230230
String name = _computeName(key);
231231
if (helpers.containsKey(key)) return name;
232-
helpers[key] = isReserved(key)
232+
helpers[key] = isReservedWord(key)
233233
? templateForReserved(name, key)
234234
: template(name, key);
235235
return name;

lib/tools/parser_getter_setter/generator.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'package:angular/core/parser/parser.dart';
2-
import 'package:angular/tools/reserved_dart_keywords.dart';
2+
import 'package:angular/utils.dart' show isReservedWord;
33
import 'dart:math';
44

55
class DartGetterSetterGen extends ParserBackend {
@@ -9,12 +9,12 @@ class DartGetterSetterGen extends ParserBackend {
99
bool isAssignable(expression) => true;
1010

1111
registerAccess(String name) {
12-
if (isReserved(name)) return;
12+
if (isReservedWord(name)) return;
1313
properties.add(name);
1414
}
1515

1616
registerCall(String name, List arguments) {
17-
if (isReserved(name)) return;
17+
if (isReservedWord(name)) return;
1818
Set<int> arities = calls.putIfAbsent(name, () => new Set<int>());
1919
arities.add(arguments.length);
2020
}

lib/tools/reserved_dart_keywords.dart

-10
This file was deleted.

lib/tools/source_metadata_extractor.dart

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'package:analyzer/src/generated/ast.dart';
44

55
import 'package:angular/tools/source_crawler.dart';
66
import 'package:angular/tools/common.dart';
7-
import 'package:angular/utils.dart';
87

98
const String _COMPONENT = '-component';
109
const String _DIRECTIVE = '-directive';

0 commit comments

Comments
 (0)