Index: third_party/pkg/angular/lib/core/parser/eval_access.dart |
diff --git a/third_party/pkg/angular/lib/core/parser/eval_access.dart b/third_party/pkg/angular/lib/core/parser/eval_access.dart |
deleted file mode 100644 |
index d8f47fea71f4799061f732478915bc35ca010ceb..0000000000000000000000000000000000000000 |
--- a/third_party/pkg/angular/lib/core/parser/eval_access.dart |
+++ /dev/null |
@@ -1,226 +0,0 @@ |
-library angular.core.parser.eval_access; |
- |
-import 'dart:mirrors'; |
-import 'package:angular/core/parser/parser.dart'; |
-import 'package:angular/core/parser/syntax.dart' as syntax; |
-import 'package:angular/core/parser/utils.dart'; |
-import 'package:angular/core/module.dart'; |
- |
-class AccessScope extends syntax.AccessScope with AccessReflective { |
- final Symbol symbol; |
- AccessScope(String name) : super(name), symbol = newSymbol(name); |
- eval(scope, [FilterMap filters]) => _eval(scope); |
- assign(scope, value) => _assign(scope, scope, value); |
-} |
- |
-class AccessScopeFast extends syntax.AccessScope with AccessFast { |
- final Getter getter; |
- final Setter setter; |
- AccessScopeFast(String name, this.getter, this.setter) : super(name); |
- eval(scope, [FilterMap filters]) => _eval(scope); |
- assign(scope, value) => _assign(scope, scope, value); |
-} |
- |
-class AccessMember extends syntax.AccessMember with AccessReflective { |
- final Symbol symbol; |
- AccessMember(object, String name) |
- : super(object, name), symbol = newSymbol(name); |
- eval(scope, [FilterMap filters]) => _eval(object.eval(scope, filters)); |
- assign(scope, value) => _assign(scope, object.eval(scope), value); |
- _assignToNonExisting(scope, value) => object.assign(scope, { name: value }); |
-} |
- |
-class AccessMemberFast extends syntax.AccessMember with AccessFast { |
- final Getter getter; |
- final Setter setter; |
- AccessMemberFast(object, String name, this.getter, this.setter) |
- : super(object, name); |
- eval(scope, [FilterMap filters]) => _eval(object.eval(scope, filters)); |
- assign(scope, value) => _assign(scope, object.eval(scope), value); |
- _assignToNonExisting(scope, value) => object.assign(scope, { name: value }); |
-} |
- |
-class AccessKeyed extends syntax.AccessKeyed { |
- AccessKeyed(object, key) : super(object, key); |
- eval(scope, [FilterMap filters]) => |
- getKeyed(object.eval(scope, filters), key.eval(scope, filters)); |
- assign(scope, value) => setKeyed(object.eval(scope), key.eval(scope), value); |
-} |
- |
- |
-/** |
- * The [AccessReflective] mixin is used to share code between access expressions |
- * where we need to use reflection to get or set a field. We optimize for the |
- * case where we access the same holder repeatedly through caching. |
- */ |
-abstract class AccessReflective { |
- static const int CACHED_FIELD = 0; |
- static const int CACHED_MAP = 1; |
- static const int CACHED_VALUE = 2; |
- |
- int _cachedKind = 0; |
- var _cachedHolder = UNINITIALIZED; |
- var _cachedValue; |
- |
- String get name; |
- Symbol get symbol; |
- |
- _eval(holder) { |
- if (!identical(holder, _cachedHolder)) return _evalUncached(holder); |
- int cachedKind = _cachedKind; |
- if (cachedKind == CACHED_MAP) return holder[name]; |
- var value = _cachedValue; |
- return (cachedKind == CACHED_FIELD && value != null) |
- ? value.getField(symbol).reflectee |
- : value; |
- } |
- |
- _evalUncached(holder) { |
- _cachedHolder = holder; |
- if (holder == null) { |
- _cachedKind = CACHED_VALUE; |
- return _cachedValue = null; |
- } else if (holder is Map) { |
- _cachedKind = CACHED_MAP; |
- _cachedValue = null; |
- return holder[name]; |
- } else if (symbol == null) { |
- _cachedHolder = UNINITIALIZED; |
- return null; |
- } |
- InstanceMirror mirror = reflect(holder); |
- try { |
- var result = mirror.getField(symbol).reflectee; |
- _cachedKind = CACHED_FIELD; |
- _cachedValue = mirror; |
- return result; |
- } on NoSuchMethodError catch (e) { |
- if (isNoSuchMethodDueToGetField(e)) { |
- var result = createInvokeClosure(mirror, symbol); |
- if (result == null) rethrow; |
- _cachedKind = CACHED_VALUE; |
- return _cachedValue = result; |
- } else { |
- rethrow; |
- } |
- } on UnsupportedError catch (e) { |
- var result = createInvokeClosure(mirror, symbol); |
- if (result == null) rethrow; |
- _cachedKind = CACHED_VALUE; |
- return _cachedValue = result; |
- } |
- } |
- |
- bool isNoSuchMethodDueToGetField(NoSuchMethodError e) { |
- var msg = e.toString(); |
- return msg.indexOf("has no instance getter '$name'.") != -1 || // Dart VM |
- msg.indexOf('Cannot call "$name\$') != -1; // Dart2JS |
- } |
- |
- _assign(scope, holder, value) { |
- if (holder is Map) { |
- holder[name] = value; |
- } else if (holder == null) { |
- _assignToNonExisting(scope, value); |
- } else if (symbol != null) { |
- reflect(holder).setField(symbol, value); |
- } |
- return value; |
- } |
- |
- // By default we don't do any assignments to non-existing holders. This |
- // is overwritten for access to members. |
- _assignToNonExisting(scope, value) => null; |
- |
- static Function createInvokeClosure(InstanceMirror mirror, Symbol symbol) { |
- if (!hasMethod(mirror, symbol)) return null; |
- return relaxFnArgs(([a0, a1, a2, a3, a4, a5]) { |
- var arguments = stripTrailingNulls([a0, a1, a2, a3, a4, a5]); |
- return mirror.invoke(symbol, arguments).reflectee; |
- }); |
- } |
- |
- static stripTrailingNulls(List list) { |
- while (list.isNotEmpty && (list.last == null)) { |
- list.removeLast(); |
- } |
- return list; |
- } |
- |
- static bool hasMethod(InstanceMirror mirror, Symbol symbol) { |
- return hasMethodHelper(mirror.type, symbol); |
- } |
- |
- static final objectClassMirror = reflectClass(Object); |
- static final Set<Symbol> objectClassInstanceMethods = |
- new Set<Symbol>.from([#toString, #noSuchMethod]); |
- |
- static final Function hasMethodHelper = (() { |
- try { |
- // Use ClassMirror.instanceMembers if available. It contains local |
- // as well as inherited members. |
- objectClassMirror.instanceMembers; |
- // For SDK 1.2 we have to use a somewhat complicated helper for this |
- // to work around bugs in the dart2js implementation. |
- return hasInstanceMethod; |
- } on NoSuchMethodError catch (e) { |
- // For SDK 1.0 we fall back to just using the local members. |
- return (type, symbol) => type.members[symbol] is MethodMirror; |
- } on UnimplementedError catch (e) { |
- // For SDK 1.1 we fall back to just using the local declarations. |
- return (type, symbol) => type.declarations[symbol] is MethodMirror; |
- } |
- return null; |
- })(); |
- |
- static bool hasInstanceMethod(type, symbol) { |
- // Always allow instance methods found in the Object class. This makes |
- // it easier to work around a few bugs in the dart2js implementation. |
- if (objectClassInstanceMethods.contains(symbol)) return true; |
- // Work around http://dartbug.com/16309 which causes access to the |
- // instance members of certain builtin types to throw exceptions |
- // while traversing the superclass chain. |
- var mirror; |
- try { |
- mirror = type.instanceMembers[symbol]; |
- } on UnsupportedError catch (e) { |
- mirror = type.declarations[symbol]; |
- } |
- // Work around http://dartbug.com/15760 which causes noSuchMethod |
- // forwarding stubs to be treated as members of all classes. We have |
- // already checked for the real instance methods in Object, so if the |
- // owner of this method is Object we simply filter it out. |
- if (mirror is !MethodMirror) return false; |
- return mirror.owner != objectClassMirror; |
- } |
-} |
- |
-/** |
- * The [AccessFast] mixin is used to share code between access expressions |
- * where we have a pair of pre-compiled getter and setter functions that we |
- * use to do the access the field. |
- */ |
-abstract class AccessFast { |
- String get name; |
- Getter get getter; |
- Setter get setter; |
- |
- _eval(holder) { |
- if (holder == null) return null; |
- return (holder is Map) ? holder[name] : getter(holder); |
- } |
- |
- _assign(scope, holder, value) { |
- if (holder == null) { |
- _assignToNonExisting(scope, value); |
- return value; |
- } else { |
- return (holder is Map) ? (holder[name] = value) : setter(holder, value); |
- } |
- } |
- |
- // By default we don't do any assignments to non-existing holders. This |
- // is overwritten for access to members. |
- _assignToNonExisting(scope, value) => null; |
-} |
- |