Index: third_party/pkg/angular/lib/core/parser/parser_dynamic.dart |
diff --git a/third_party/pkg/angular/lib/core/parser/parser_dynamic.dart b/third_party/pkg/angular/lib/core/parser/parser_dynamic.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..967db7bede7ea4561d9532aea6e000873ef51b4a |
--- /dev/null |
+++ b/third_party/pkg/angular/lib/core/parser/parser_dynamic.dart |
@@ -0,0 +1,58 @@ |
+library angular.core.parser_dynamic; |
+ |
+@MirrorsUsed(targets: const [ DynamicClosureMap ], metaTargets: const [] ) |
+import 'dart:mirrors'; |
+import 'package:angular/core/parser/parser.dart'; |
+ |
+class DynamicClosureMap implements ClosureMap { |
+ final Map<String, Symbol> symbols = {}; |
+ Getter lookupGetter(String name) { |
+ var symbol = new Symbol(name); |
+ return (o) { |
+ if (o is Map) { |
+ return o[name]; |
+ } else { |
+ return reflect(o).getField(symbol).reflectee; |
+ } |
+ }; |
+ } |
+ |
+ Setter lookupSetter(String name) { |
+ var symbol = new Symbol(name); |
+ return (o, value) { |
+ if (o is Map) { |
+ return o[name] = value; |
+ } else { |
+ reflect(o).setField(symbol, value); |
+ return value; |
+ } |
+ }; |
+ } |
+ |
+ MethodClosure lookupFunction(String name, CallArguments arguments) { |
+ var symbol = new Symbol(name); |
+ return (o, posArgs, namedArgs) { |
+ var sNamedArgs = {}; |
+ namedArgs.forEach((name, value) { |
+ var symbol = symbols.putIfAbsent(name, () => new Symbol(name)); |
+ sNamedArgs[symbol] = value; |
+ }); |
+ if (o is Map) { |
+ var fn = o[name]; |
+ if (fn is Function) { |
+ return Function.apply(fn, posArgs, sNamedArgs); |
+ } else { |
+ throw "Property '$name' is not of type function."; |
+ } |
+ } else { |
+ try { |
+ return reflect(o).invoke(symbol, posArgs, sNamedArgs).reflectee; |
+ } on NoSuchMethodError catch (e) { |
+ throw 'Undefined function $name'; |
+ } |
+ } |
+ }; |
+ } |
+ |
+ Symbol lookupSymbol(String name) => new Symbol(name); |
+} |