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

Commit 1c9559e

Browse files
committed
feat(spec): Do not fall-thru to the dynamic parser in the static parser spec
1 parent 8b2c3b6 commit 1c9559e

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

bin/parser_generator_for_spec.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ main(arguments) {
1818
// List generated using:
1919
// node node_modules/karma/bin/karma run | grep -Eo ":XNAY:.*:XNAY:" | sed -e 's/:XNAY://g' | sed -e "s/^/'/" | sed -e "s/$/',/" | sort | uniq > missing_expressions
2020
injector.get(isGetter ? ParserGetterSetter : ParserGenerator).generateParser([
21-
"foo == 'bar' ||\nbaz"
21+
"foo == 'bar' ||\nbaz",
22+
"this['a'].b",
23+
"const",
2224
"null",
2325
"[1, 2].length",
2426
"doesNotExist",

lib/tools/parser_getter_setter/generator.dart

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
import 'package:angular/core/parser/parser_library.dart';
22

3+
// TODO(deboer): Remove this duplicated code.
4+
// From https://www.dartlang.org/docs/spec/latest/dart-language-specification.html#h.huusvrzea3q
5+
List<String> RESERVED_DART_KEYWORDS = [
6+
"assert", "break", "case", "catch", "class", "const", "continue",
7+
"default", "do", "else", "enum", "extends", "false", "final",
8+
"finally", "for", "if", "in", "is", "new", "null", "rethrow",
9+
"return", "super", "switch", "this", "throw", "true", "try",
10+
"var", "void", "while", "with"];
11+
isReserved(String key) => RESERVED_DART_KEYWORDS.contains(key);
12+
313
class _AST implements ParserAST {
414
bool get assignable => true;
515
}
@@ -50,7 +60,8 @@ class ParserGetterSetter {
5060
print(generateCode(backend.identifiers.keys.toList()));
5161
}
5262

53-
generateCode(List<String> keys) {
63+
generateCode(Iterable<String> keys) {
64+
keys = keys.where((key) => !isReserved(key));
5465
return '''
5566
class StaticGetterSetter extends GetterSetter {
5667
Map<String, Function> _getters = ${generateGetterMap(keys)};
@@ -68,12 +79,12 @@ class StaticGetterSetter extends GetterSetter {
6879
''';
6980
}
7081

71-
generateGetterMap(List<String> keys) {
82+
generateGetterMap(Iterable<String> keys) {
7283
var lines = keys.map((key) => 'r"${key}": (s) => s.$key');
7384
return '{\n ${lines.join(",\n ")}\n }';
7485
}
7586

76-
generateSetterMap(List<String> keys) {
87+
generateSetterMap(Iterable<String> keys) {
7788
var lines = keys.map((key) => 'r"${key}": (s, v) => s.$key = v');
7889
return '{\n ${lines.join(",\n ")}\n }';
7990
}

test/core/parser/generated_parser_spec.dart

+8
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,18 @@ import '../../_specs.dart';
44
import 'parser_spec.dart' as parser_spec;
55
import 'generated_functions.dart' as generated_functions;
66

7+
class AlwaysThrowError implements DynamicParser {
8+
call(String x) { throw "Fall-thru to DynamicParser disabled [$x]"; }
9+
primaryFromToken(Token token, parserError) => null;
10+
}
11+
12+
713
main() {
814
describe('generated parser', () {
915
beforeEach(module((Module module) {
1016
module.type(Parser, implementedBy: StaticParser);
17+
module.type(DynamicParser, implementedBy: AlwaysThrowError);
18+
1119
module.factory(StaticParserFunctions, (Injector injector) {
1220
return generated_functions.functions(injector.get(FilterMap));
1321
});

0 commit comments

Comments
 (0)