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

Unified Diff: sdk/lib/_internal/lib/js_mirrors.dart

Issue 137123005: dart2js: Implement instanceMembers and staticMembers. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 months 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 | « runtime/lib/mirrors_impl.dart ('k') | tests/lib/lib.status » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 2d27bab0de872fe8d310e9e7111db6016bdb915c..4740db90e2ebbb0308c9a96bcd8ee05137c79b54 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();
bool get isAbstract => throw new UnimplementedError();
@@ -969,6 +977,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,
@@ -1094,6 +1104,56 @@ 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) {
+ result[decl.simpleName] = decl;
+ }
+ if (decl is VariableMirror && decl.isStatic) {
+ var getterName = decl.simpleName;
+ result[getterName] = new JsSyntheticAccessor(
+ this, getterName, true, true, false, decl);
+ if (!decl.isFinal) {
+ var setterName = setterSymbol(decl.simpleName);
+ result[setterName] = new JsSyntheticAccessor(
+ 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 JsSyntheticAccessor(
+ this, getterName, true, false, false, decl);
+ if (!decl.isFinal) {
+ var setterName = setterSymbol(decl.simpleName);
+ result[setterName] = new JsSyntheticAccessor(
+ this, setterName, false, false, false, decl);
+ }
+ }
+ });
+ _cachedInstanceMembers = result;
+ }
+ return _cachedInstanceMembers;
+ }
+
InstanceMirror setField(Symbol fieldName, Object arg) {
return _class.setField(fieldName, arg);
}
@@ -1163,19 +1223,78 @@ 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 JsSyntheticAccessor implements MethodMirror {
+ final DeclarationMirror owner;
+ final Symbol simpleName;
+ final bool isGetter;
+ final bool isStatic;
+ final bool isTopLevel;
+ final _target; /// The field or type that introduces the synthetic accessor.
+
+ JsSyntheticAccessor(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 JsSyntheticSetterParameter(this, this._target)]);
+ }
+
+ List<InstanceMirror> get metadata => const [];
+ String get source => null;
+ SourceLocation get location => throw new UnimplementedError();
+}
+
+class JsSyntheticSetterParameter implements ParameterMirror {
+ final DeclarationMirror owner;
+ final VariableMirror _target;
+
+ JsSyntheticSetterParameter(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;
+ List<InstanceMirror> get metadata => const [];
+ SourceLocation get location => throw new UnimplementedError();
+}
+
class JsClassMirror extends JsTypeMirror with JsObjectMirror
implements ClassMirror {
final String _mangledName;
@@ -1197,6 +1316,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;
@@ -1360,6 +1481,56 @@ 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) {
+ result[decl.simpleName] = decl;
+ }
+ if (decl is VariableMirror && decl.isStatic) {
+ var getterName = decl.simpleName;
+ result[getterName] = new JsSyntheticAccessor(
+ this, getterName, true, true, false, decl);
+ if (!decl.isFinal) {
+ var setterName = setterSymbol(decl.simpleName);
+ result[setterName] = new JsSyntheticAccessor(
+ 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 JsSyntheticAccessor(
+ this, getterName, true, false, false, decl);
+ if (!decl.isFinal) {
+ var setterName = setterSymbol(decl.simpleName);
+ result[setterName] = new JsSyntheticAccessor(
+ 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) {
@@ -1556,13 +1727,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.
« no previous file with comments | « runtime/lib/mirrors_impl.dart ('k') | tests/lib/lib.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698