Index: sdk/lib/_internal/lib/js_mirrors.dart |
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart |
index 18829bf7038177cfd16067e19184be43f43138a3..dc817070c0bb25bb2f4a0ee6ceec1ab0c407f228 100644 |
--- a/sdk/lib/_internal/lib/js_mirrors.dart |
+++ b/sdk/lib/_internal/lib/js_mirrors.dart |
@@ -687,6 +687,7 @@ class JsMixinApplication extends JsTypeMirror with JsObjectMirror |
final ClassMirror superclass; |
final ClassMirror mixin; |
Symbol _cachedSimpleName; |
+ Map<Symbol, MethodMirror> _cachedInstanceMembers; |
JsMixinApplication(ClassMirror superclass, ClassMirror mixin, |
String mangledName) |
@@ -721,6 +722,20 @@ class JsMixinApplication extends JsTypeMirror with JsObjectMirror |
Map<Symbol, DeclarationMirror> get declarations => mixin.declarations; |
+ Map<Symbol, MethodMirror> get instanceMembers { |
+ if (_cachedInstanceMembers == null) { |
+ var result = new Map<Symbol, MethodMirror>(); |
+ if (superclass != null) { |
+ result.addAll(superclass.instanceMembers); |
+ } |
+ result.addAll(mixin.instanceMembers); |
+ _cachedInstanceMembers = result; |
+ } |
+ return _cachedInstanceMembers; |
+ } |
+ |
+ Map<Symbol, MethodMirror> get staticMembers => mixin.staticMembers; |
+ |
_asRuntimeType() => null; |
InstanceMirror invoke( |
@@ -766,13 +781,6 @@ class JsMixinApplication extends JsTypeMirror with JsObjectMirror |
List<TypeMirror> get typeArguments => const <TypeMirror>[]; |
// TODO(ahe): Implement this. |
- Map<Symbol, MethodMirror> get instanceMembers |
- => throw new UnimplementedError(); |
- |
- // TODO(ahe): Implement this. |
- Map<Symbol, MethodMirror> get staticMembers => throw new UnimplementedError(); |
- |
- // TODO(ahe): Implement this. |
Function operator [](Symbol name) => throw new UnimplementedError(); |
} |
@@ -967,6 +975,8 @@ class JsTypeBoundClassMirror extends JsDeclarationMirror |
List<JsMethodMirror> _cachedMethods; |
ClassMirror _superclass; |
List<ClassMirror> _cachedSuperinterfaces; |
+ Map<Symbol, MethodMirror> _cachedInstanceMembers; |
+ Map<Symbol, MethodMirror> _cachedStaticMembers; |
JsTypeBoundClassMirror(JsClassMirror originalDeclaration, this._typeArguments) |
: _class = originalDeclaration, |
@@ -1092,6 +1102,57 @@ class JsTypeBoundClassMirror extends JsDeclarationMirror |
new UnmodifiableMapView<Symbol, DeclarationMirror>(result); |
} |
+ Map<Symbol, MethodMirror> get staticMembers { |
+ if (_cachedStaticMembers == null) { |
+ 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 = setterSymbol(decl.simpleName); |
+ result[setterName] = new _SyntheticAccessor( |
+ this, setterName, false, true, false, decl); |
+ } |
+ } |
+ }); |
+ _cachedStaticMembers = result; |
+ } |
+ return _cachedStaticMembers; |
+ } |
+ |
+ Map<Symbol, MethodMirror> get instanceMembers { |
+ if (_cachedInstanceMembers == null) { |
+ 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 = setterSymbol(decl.simpleName); |
+ result[setterName] = new _SyntheticAccessor( |
+ this, setterName, false, false, false, decl); |
+ } |
+ } |
+ }); |
+ _cachedInstanceMembers = result; |
+ } |
+ return _cachedInstanceMembers; |
+ } |
+ |
InstanceMirror setField(Symbol fieldName, Object arg) { |
return _class.setField(fieldName, arg); |
} |
@@ -1159,19 +1220,76 @@ class JsTypeBoundClassMirror extends JsDeclarationMirror |
Symbol get simpleName => _class.simpleName; |
// TODO(ahe): Implement this. |
- Map<Symbol, MethodMirror> get instanceMembers |
- => throw new UnimplementedError(); |
- |
- // TODO(ahe): Implement this. |
- Map<Symbol, MethodMirror> get staticMembers => throw new UnimplementedError(); |
- |
- // TODO(ahe): Implement this. |
ClassMirror get mixin => throw new UnimplementedError(); |
// TODO(ahe): Implement this. |
Function operator [](Symbol name) => throw new UnimplementedError(); |
} |
+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 const []; |
+ return new UnmodifiableListView( |
+ [new _SyntheticSetterParameter(this, this._target)]); |
+ } |
+ |
+ List<InstanceMirror> get metadata => const []; |
+ |
+ String get source => null; |
+} |
+ |
+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 JsClassMirror extends JsTypeMirror with JsObjectMirror |
implements ClassMirror { |
final String _mangledName; |
@@ -1193,6 +1311,8 @@ class JsClassMirror extends JsTypeMirror with JsObjectMirror |
UnmodifiableListView<InstanceMirror> _cachedMetadata; |
UnmodifiableListView<ClassMirror> _cachedSuperinterfaces; |
UnmodifiableListView<TypeVariableMirror> _cachedTypeVariables; |
+ Map<Symbol, MethodMirror> _cachedInstanceMembers; |
+ Map<Symbol, MethodMirror> _cachedStaticMembers; |
// Set as side-effect of accessing JsLibraryMirror.classes. |
JsLibraryMirror _owner; |
@@ -1356,6 +1476,57 @@ class JsClassMirror extends JsTypeMirror with JsObjectMirror |
new UnmodifiableMapView<Symbol, DeclarationMirror>(result); |
} |
+ Map<Symbol, MethodMirror> get staticMembers { |
+ if (_cachedStaticMembers == null) { |
+ 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 = setterSymbol(decl.simpleName); |
+ result[setterName] = new _SyntheticAccessor( |
+ this, setterName, false, true, false, decl); |
+ } |
+ } |
+ }); |
+ _cachedStaticMembers = result; |
+ } |
+ return _cachedStaticMembers; |
+ } |
+ |
+ Map<Symbol, MethodMirror> get instanceMembers { |
+ if (_cachedInstanceMembers == null) { |
+ 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 = setterSymbol(decl.simpleName); |
+ result[setterName] = new _SyntheticAccessor( |
+ this, setterName, false, false, false, decl); |
+ } |
+ } |
+ }); |
+ _cachedInstanceMembers = result; |
+ } |
+ return _cachedInstanceMembers; |
+ } |
+ |
InstanceMirror setField(Symbol fieldName, Object arg) { |
JsVariableMirror mirror = __variables[fieldName]; |
if (mirror != null && mirror.isStatic && !mirror.isFinal) { |
@@ -1552,13 +1723,6 @@ class JsClassMirror extends JsTypeMirror with JsObjectMirror |
} |
// TODO(ahe): Implement this. |
- Map<Symbol, MethodMirror> get instanceMembers |
- => throw new UnimplementedError(); |
- |
- // TODO(ahe): Implement this. |
- Map<Symbol, MethodMirror> get staticMembers => throw new UnimplementedError(); |
- |
- // TODO(ahe): Implement this. |
ClassMirror get mixin => throw new UnimplementedError(); |
// TODO(ahe): Implement this. |