| Index: third_party/pkg/angular/lib/tools/parser_getter_setter/generator.dart
|
| diff --git a/third_party/pkg/angular/lib/tools/parser_getter_setter/generator.dart b/third_party/pkg/angular/lib/tools/parser_getter_setter/generator.dart
|
| index b33244e104b718883af7a773ffb96b65c70f07fd..115989f8627e02901cf524b78d9622aa2a43f033 100644
|
| --- a/third_party/pkg/angular/lib/tools/parser_getter_setter/generator.dart
|
| +++ b/third_party/pkg/angular/lib/tools/parser_getter_setter/generator.dart
|
| @@ -1,10 +1,10 @@
|
| import 'package:angular/core/parser/parser.dart';
|
| import 'package:angular/utils.dart' show isReservedWord;
|
| -import 'dart:math';
|
|
|
| class DartGetterSetterGen extends ParserBackend {
|
| - final Set<String> properties = new Set<String>();
|
| - final Map<String, Set<int>> calls = new Map<String, Set<int>>();
|
| + final properties = new Set<String>();
|
| + final calls = new Set<String>();
|
| + final symbols = new Set<String>();
|
|
|
| bool isAssignable(expression) => true;
|
|
|
| @@ -13,20 +13,18 @@ class DartGetterSetterGen extends ParserBackend {
|
| properties.add(name);
|
| }
|
|
|
| - registerCall(String name, List arguments) {
|
| + registerCall(String name, CallArguments arguments) {
|
| if (isReservedWord(name)) return;
|
| - Set<int> arities = calls.putIfAbsent(name, () => new Set<int>());
|
| - arities.add(arguments.length);
|
| + calls.add(name);
|
| + symbols.addAll(arguments.named.keys);
|
| }
|
|
|
| - newAccessScope(String name)
|
| - => registerAccess(name);
|
| - newAccessMember(var object, String name)
|
| - => registerAccess(name);
|
| - newCallScope(String name, List arguments)
|
| - => registerCall(name, arguments);
|
| - newCallMember(var object, String name, List arguments)
|
| - => registerCall(name, arguments);
|
| + newAccessScope(String name) => registerAccess(name);
|
| + newAccessMember(var object, String name) => registerAccess(name);
|
| + newCallScope(String name, CallArguments arguments) =>
|
| + registerCall(name, arguments);
|
| + newCallMember(var object, String name, CallArguments arguments) =>
|
| + registerCall(name, arguments);
|
| }
|
|
|
| class ParserGetterSetter {
|
| @@ -34,7 +32,7 @@ class ParserGetterSetter {
|
| final ParserBackend backend;
|
| ParserGetterSetter(this.parser, this.backend);
|
|
|
| - generateParser(List<String> exprs) {
|
| + generateParser(List<String> exprs, StringSink sink) {
|
| exprs.forEach((expr) {
|
| try {
|
| parser(expr);
|
| @@ -44,58 +42,34 @@ class ParserGetterSetter {
|
| });
|
|
|
| DartGetterSetterGen backend = this.backend;
|
| - print(generateClosureMap(backend.properties, backend.calls));
|
| + sink.write(generateClosureMap(backend.properties, backend.calls,
|
| + backend.symbols));
|
| }
|
|
|
| - generateClosureMap(Set<String> properties, Map<String, Set<int>> calls) {
|
| + generateClosureMap(Set<String> properties,
|
| + Set<String> calls,
|
| + Set<String> symbols) {
|
| + var getters = new Set.from(properties)..addAll(calls);
|
| return '''
|
| -class StaticClosureMap extends ClosureMap {
|
| - Map<String, Getter> _getters = ${generateGetterMap(properties)};
|
| - Map<String, Setter> _setters = ${generateSetterMap(properties)};
|
| - List<Map<String, Function>> _functions = ${generateFunctionMap(calls)};
|
| -
|
| - Getter lookupGetter(String name)
|
| - => _getters[name];
|
| - Setter lookupSetter(String name)
|
| - => _setters[name];
|
| - lookupFunction(String name, int arity)
|
| - => (arity < _functions.length) ? _functions[arity][name] : null;
|
| -}
|
| +StaticClosureMap closureMap = new StaticClosureMap(
|
| + ${generateGetterMap(getters)},
|
| + ${generateSetterMap(properties)},
|
| + ${generateSymbolMap(symbols)});
|
| ''';
|
| }
|
|
|
| generateGetterMap(Iterable<String> keys) {
|
| - var lines = keys.map((key) => 'r"${key}": (o) => o.$key');
|
| - return '{\n ${lines.join(",\n ")}\n }';
|
| + var lines = keys.map((key) => ' r"${key}": (o) => o.$key');
|
| + return '{\n${lines.join(",\n")}\n }';
|
| }
|
|
|
| generateSetterMap(Iterable<String> keys) {
|
| - var lines = keys.map((key) => 'r"${key}": (o, v) => o.$key = v');
|
| - return '{\n ${lines.join(",\n ")}\n }';
|
| + var lines = keys.map((key) => ' r"${key}": (o,v) => o.$key = v');
|
| + return '{\n${lines.join(",\n")}\n }';
|
| }
|
|
|
| - generateFunctionMap(Map<String, Set<int>> calls) {
|
| - Map<int, Set<String>> arities = {};
|
| - calls.forEach((name, callArities) {
|
| - callArities.forEach((arity){
|
| - arities.putIfAbsent(arity, () => new Set<String>()).add(name);
|
| - });
|
| - });
|
| -
|
| - var maxArity = arities.keys.reduce((x, y) => max(x, y));
|
| -
|
| - var maps = new Iterable.generate(maxArity, (arity) {
|
| - var names = arities[arity];
|
| - if (names == null) {
|
| - return '{\n }';
|
| - } else {
|
| - var args = new List.generate(arity, (e) => "a$e").join(',');
|
| - var p = args.isEmpty ? '' : ', $args';
|
| - var lines = names.map((name) => 'r"$name": (o$p) => o.$name($args)');
|
| - return '{\n ${lines.join(",\n ")}\n }';
|
| - }
|
| - });
|
| -
|
| - return '[${maps.join(",")}]';
|
| + generateSymbolMap(Set<String> symbols) {
|
| + var lines = symbols.map((key) => ' r"${key}": #$key');
|
| + return '{\n${lines.join(",\n")}\n }';
|
| }
|
| }
|
|
|