| 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 {
|
|
|