Index: runtime/lib/mirrors_impl.dart |
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart |
index 9826ce4b3e3a9e6fc24fd72e6034362464c2bf63..d4dcf9888e1db23e2bee3c8752bdbda588145871 100644 |
--- a/runtime/lib/mirrors_impl.dart |
+++ b/runtime/lib/mirrors_impl.dart |
@@ -175,6 +175,76 @@ class _InvocationTrampoline implements Function { |
} |
} |
+class _SyntheticAccessor implements MethodMirror { |
+ final DeclarationMirror owner; |
+ final Symbol simpleName; |
+ final bool isGetter; |
+ final bool isStatic; |
+ final bool isTopLevel; |
+ final _target; |
+ |
+ _SyntheticAccessor(this.owner, |
+ this.simpleName, |
+ this.isGetter, |
+ this.isStatic, |
+ this.isTopLevel, |
+ this._target); |
+ |
+ bool get isSynthetic => true; |
+ bool get isRegularMethod => false; |
+ bool get isOperator => false; |
+ bool get isConstructor => false; |
+ bool get isConstConstructor => false; |
+ bool get isGenerativeConstructor => false; |
+ bool get isFactoryConstructor => false; |
+ bool get isRedirectingConstructor => false; |
+ bool get isAbstract => false; |
+ |
+ |
+ bool get isSetter => !isGetter; |
+ bool get isPrivate => _n(simpleName).startsWith('_'); |
+ |
+ Symbol get qualifiedName => _computeQualifiedName(owner, simpleName); |
+ Symbol get constructorName => const Symbol(''); |
+ |
+ TypeMirror get returnType => _target.type; |
+ List<ParameterMirror> get parameters { |
+ if (isGetter) return emptyList; |
+ return new UnmodifiableListView( |
+ [new _SyntheticSetterParameter(this, this._target)]); |
+ } |
+ |
+ List<InstanceMirror> get metadata => emptyList; |
+ |
+ String get source => '<synthetic code>'; |
+} |
+ |
+class _SyntheticSetterParameter implements ParameterMirror { |
+ final DeclarationMirror owner; |
+ final VariableMirror _target; |
+ _SyntheticSetterParameter(this.owner, this._target); |
+ |
+ Symbol get simpleName => _target.simpleName; |
+ Symbol get qualifiedName => _computeQualifiedName(owner, simpleName); |
+ TypeMirror get type => _target.type; |
+ |
+ bool get isOptional => false; |
+ bool get isNamed => false; |
+ bool get isStatic => false; |
+ bool get isTopLevel => false; |
+ bool get isConst => false; |
+ bool get isFinal => true; |
+ bool get isPrivate => false; |
+ bool get hasDefaultValue => false; |
+ InstanceMirror get defaultValue => null; |
+} |
+ |
+class _SyntheticTypeGetter extends _SyntheticAccessor { |
+ _SyntheticTypeGetter(owner, simpleName, target) |
+ : super(owner, simpleName, true, true, true, target); |
+ TypeMirror get returnType => _target; |
+} |
+ |
abstract class _LocalObjectMirrorImpl extends _LocalMirrorImpl |
implements ObjectMirror { |
_LocalObjectMirrorImpl(this._reflectee); |
@@ -525,6 +595,55 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
return _mixin; |
} |
+ var _cachedStaticMembers; |
+ Map<Symbol, MethodMirror> get staticMembers { |
+ if (_cachedStaticMembers != null) return _cachedStaticMembers; |
+ var result = new Map<Symbol, MethodMirror>(); |
+ declarations.values.forEach((decl) { |
+ if (decl is MethodMirror && decl.isStatic && |
+ !decl.isConstructor && !decl.isAbstract) { |
+ result[decl.simpleName] = decl; |
+ } |
+ if (decl is VariableMirror && decl.isStatic) { |
+ var getterName = decl.simpleName; |
+ result[getterName] = |
+ new _SyntheticAccessor(this, getterName, true, true, false, decl); |
+ if (!decl.isFinal) { |
+ var setterName = _asSetter(decl.simpleName, this.owner); |
+ result[setterName] = new _SyntheticAccessor( |
+ this, setterName, false, true, false, decl); |
+ } |
+ } |
+ }); |
+ return _cachedStaticMembers = result; |
+ } |
+ |
+ var _cachedInstanceMembers; |
+ Map<Symbol, MethodMirror> get instanceMembers { |
+ if (_cachedInstanceMembers != null) return _cachedInstanceMembers; |
+ var result = new Map<Symbol, MethodMirror>(); |
+ if (superclass != null) { |
+ result.addAll(superclass.instanceMembers); |
+ } |
+ declarations.values.forEach((decl) { |
+ if (decl is MethodMirror && !decl.isStatic && |
+ !decl.isConstructor && !decl.isAbstract) { |
+ result[decl.simpleName] = decl; |
+ } |
+ if (decl is VariableMirror && !decl.isStatic) { |
+ var getterName = decl.simpleName; |
+ result[getterName] = |
+ new _SyntheticAccessor(this, getterName, true, false, false, decl); |
+ if (!decl.isFinal) { |
+ var setterName = _asSetter(decl.simpleName, this.owner); |
+ result[setterName] = new _SyntheticAccessor( |
+ this, setterName, false, false, false, decl); |
+ } |
+ } |
+ }); |
+ return _cachedInstanceMembers = result; |
+ } |
+ |
Map<Symbol, DeclarationMirror> _declarations; |
Map<Symbol, DeclarationMirror> get declarations { |
if (_declarations != null) return _declarations; |
@@ -992,6 +1111,11 @@ class _LocalTypedefMirrorImpl extends _LocalDeclarationMirrorImpl |
native "TypedefMirror_declaration"; |
} |
+Symbol _asSetter(Symbol getter, LibraryMirror library) { |
+ var unwrapped = MirrorSystem.getName(getter); |
+ return MirrorSystem.getSymbol('${unwrapped}=', library); |
+} |
+ |
class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
implements LibraryMirror { |
_LocalLibraryMirrorImpl(reflectee, |
@@ -1002,6 +1126,7 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
super(reflectee); |
final Symbol simpleName; |
+ final Uri uri; |
// The simple name and the qualified name are the same for a library. |
Symbol get qualifiedName => simpleName; |
@@ -1021,7 +1146,31 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
throw new UnimplementedError('LibraryMirror.location is not implemented'); |
} |
- final Uri uri; |
+ var _cachedTopLevelMembers; |
+ Map<Symbol, MethodMirror> get topLevelMembers { |
+ if (_cachedTopLevelMembers != null) return _cachedTopLevelMembers; |
+ var result = new Map<Symbol, MethodMirror>(); |
+ declarations.values.forEach((decl) { |
+ if (decl is MethodMirror && !decl.isAbstract) { |
+ result[decl.simpleName] = decl; |
+ } |
+ if (decl is VariableMirror) { |
+ var getterName = decl.simpleName; |
+ result[getterName] = |
+ new _SyntheticAccessor(this, getterName, true, true, true, decl); |
+ if (!decl.isFinal) { |
+ var setterName = _asSetter(decl.simpleName, this); |
+ result[setterName] = new _SyntheticAccessor( |
+ this, setterName, false, true, true, decl); |
+ } |
+ } |
+ if (decl is TypeMirror) { |
+ var getterName = decl.simpleName; |
+ result[getterName] = new _SyntheticTypeGetter(this, getterName, decl); |
+ } |
+ }); |
+ return _cachedTopLevelMembers = result; |
+ } |
Map<Symbol, DeclarationMirror> _declarations; |
Map<Symbol, DeclarationMirror> get declarations { |
@@ -1155,6 +1304,7 @@ class _LocalMethodMirrorImpl extends _LocalDeclarationMirrorImpl |
final bool isRedirectingConstructor; |
final bool isFactoryConstructor; |
final bool isOperator; |
+ bool get isSynthetic => false; |
DeclarationMirror _owner; |
DeclarationMirror get owner { |