Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(658)

Unified Diff: runtime/lib/mirrors_impl.dart

Issue 67203002: Implement topLevelMembers, staticMembers, instanceMembers in the VM. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | sdk/lib/_internal/lib/js_mirrors.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/lib/mirrors_impl.dart
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index ec24d3e13cab5d4c2aa275dca1c119eabd54468e..05f44e8fa6919ceb1df9802e48bb314bc89682ff 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -160,6 +160,70 @@ 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 => 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;
+}
+
abstract class _LocalObjectMirror extends _LocalMirror implements ObjectMirror {
final _reflectee; // May be a MirrorReference or an ordinary object.
@@ -492,6 +556,59 @@ class _LocalClassMirror extends _LocalObjectMirror
return _mixin;
}
+ var _cachedStaticMembers;
+ 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 = _asSetter(decl.simpleName, this.owner);
+ result[setterName] = new _SyntheticAccessor(
+ this, setterName, false, true, false, decl);
+ }
+ }
+ });
+ _cachedStaticMembers = result;
+ }
+ return _cachedStaticMembers;
+ }
+
+ var _cachedInstanceMembers;
+ 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 = _asSetter(decl.simpleName, this.owner);
+ result[setterName] = new _SyntheticAccessor(
+ this, setterName, false, false, false, decl);
+ }
+ }
+ });
+ _cachedInstanceMembers = result;
+ }
+ return _cachedInstanceMembers;
+ }
+
Map<Symbol, DeclarationMirror> _declarations;
Map<Symbol, DeclarationMirror> get declarations {
if (_declarations != null) return _declarations;
@@ -918,8 +1035,12 @@ class _LocalTypedefMirror extends _LocalDeclarationMirror
native "TypedefMirror_declaration";
}
-class _LocalLibraryMirror extends _LocalObjectMirror
- implements LibraryMirror {
+Symbol _asSetter(Symbol getter, LibraryMirror library) {
+ var unwrapped = MirrorSystem.getName(getter);
+ return MirrorSystem.getSymbol('${unwrapped}=', library);
+}
+
+class _LocalLibraryMirror extends _LocalObjectMirror implements LibraryMirror {
final Symbol simpleName;
final Uri uri;
@@ -951,6 +1072,11 @@ class _LocalLibraryMirror extends _LocalObjectMirror
new _UnmodifiableMapView<Symbol, DeclarationMirror>(_members);
}
+ Map<Symbol, MethodMirror> get topLevelMembers {
+ throw new UnimplementedError(
+ 'LibraryMirror.topLevelMembers is not implemented');
+ }
+
Map<Symbol, Mirror> _cachedMembers;
Map<Symbol, Mirror> get _members {
if (_cachedMembers == null) {
@@ -1005,7 +1131,7 @@ class _LocalLibraryMirror extends _LocalObjectMirror
native "LibraryMirror_members";
}
-class _LocalMethodMirror extends _LocalDeclarationMirror
+class _LocalMethodMirror extends _LocalDeclarationMirror
implements MethodMirror {
final bool isStatic;
final bool isAbstract;
@@ -1050,6 +1176,7 @@ class _LocalMethodMirror extends _LocalDeclarationMirror
_n(constructorName).startsWith('_');
bool get isTopLevel => owner is LibraryMirror;
+ bool get isSynthetic => false;
SourceLocation get location {
throw new UnimplementedError('MethodMirror.location is not implemented');
« no previous file with comments | « no previous file | sdk/lib/_internal/lib/js_mirrors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698