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

Side by Side 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: doc tweak 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 // VM-specific implementation of the dart:mirrors library. 5 // VM-specific implementation of the dart:mirrors library.
6 6
7 import "dart:collection"; 7 import "dart:collection";
8 8
9 final emptyList = new UnmodifiableListView([]); 9 final emptyList = new UnmodifiableListView([]);
10 final emptyMap = new _UnmodifiableMapView({}); 10 final emptyMap = new _UnmodifiableMapView({});
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 final Symbol _selector; 153 final Symbol _selector;
154 _InvocationTrampoline(this._receiver, this._selector); 154 _InvocationTrampoline(this._receiver, this._selector);
155 noSuchMethod(Invocation msg) { 155 noSuchMethod(Invocation msg) {
156 if (msg.memberName != #call) return super.noSuchMethod(msg); 156 if (msg.memberName != #call) return super.noSuchMethod(msg);
157 return _receiver.invoke(_selector, 157 return _receiver.invoke(_selector,
158 msg.positionalArguments, 158 msg.positionalArguments,
159 msg.namedArguments); 159 msg.namedArguments);
160 } 160 }
161 } 161 }
162 162
163 class _SyntheticAccessor implements MethodMirror {
164 final DeclarationMirror owner;
165 final Symbol simpleName;
166 final bool isGetter;
167 final bool isStatic;
168 final bool isTopLevel;
169 final _target;
170
171 _SyntheticAccessor(this.owner,
172 this.simpleName,
173 this.isGetter,
174 this.isStatic,
175 this.isTopLevel,
176 this._target);
177
178 bool get isSynthetic => true;
179 bool get isRegularMethod => false;
180 bool get isOperator => false;
181 bool get isConstructor => false;
182 bool get isConstConstructor => false;
183 bool get isGenerativeConstructor => false;
184 bool get isFactoryConstructor => false;
185 bool get isRedirectingConstructor => false;
186 bool get isAbstract => false;
187
188 bool get isSetter => !isGetter;
189 bool get isPrivate => _n(simpleName).startsWith('_');
190
191 Symbol get qualifiedName => _computeQualifiedName(owner, simpleName);
192 Symbol get constructorName => const Symbol('');
193
194 TypeMirror get returnType => _target.type;
195 List<ParameterMirror> get parameters {
196 if (isGetter) return emptyList;
197 return new UnmodifiableListView(
198 [new _SyntheticSetterParameter(this, this._target)]);
199 }
200
201 List<InstanceMirror> get metadata => emptyList;
202
203 String get source => '<synthetic code>';
ahe 2013/12/06 12:20:40 I'm worried that returning illegal syntax leads to
rmacnak 2013/12/07 02:09:06 Done.
204 }
205
206 class _SyntheticSetterParameter implements ParameterMirror {
207 final DeclarationMirror owner;
208 final VariableMirror _target;
209
210 _SyntheticSetterParameter(this.owner, this._target);
211
212 Symbol get simpleName => _target.simpleName;
213 Symbol get qualifiedName => _computeQualifiedName(owner, simpleName);
214 TypeMirror get type => _target.type;
215
216 bool get isOptional => false;
217 bool get isNamed => false;
218 bool get isStatic => false;
219 bool get isTopLevel => false;
220 bool get isConst => false;
221 bool get isFinal => true;
222 bool get isPrivate => false;
223 bool get hasDefaultValue => false;
224 InstanceMirror get defaultValue => null;
225 }
226
227 class _SyntheticTypeGetter extends _SyntheticAccessor {
ahe 2013/12/06 12:20:40 I want to make sure that we're building a mirror A
rmacnak 2013/12/06 19:41:35 Right, the intention of instance/static/topLevelMe
228 _SyntheticTypeGetter(owner, simpleName, target)
229 : super(owner, simpleName, true, true, true, target);
230 TypeMirror get returnType => reflectClass(Type);
231 }
232
163 abstract class _LocalObjectMirror extends _LocalMirror implements ObjectMirror { 233 abstract class _LocalObjectMirror extends _LocalMirror implements ObjectMirror {
164 final _reflectee; // May be a MirrorReference or an ordinary object. 234 final _reflectee; // May be a MirrorReference or an ordinary object.
165 235
166 _LocalObjectMirror(this._reflectee); 236 _LocalObjectMirror(this._reflectee);
167 237
168 InstanceMirror invoke(Symbol memberName, 238 InstanceMirror invoke(Symbol memberName,
169 List positionalArguments, 239 List positionalArguments,
170 [Map<Symbol, dynamic> namedArguments]) { 240 [Map<Symbol, dynamic> namedArguments]) {
171 int numPositionalArguments = positionalArguments.length; 241 int numPositionalArguments = positionalArguments.length;
172 int numNamedArguments = namedArguments != null ? namedArguments.length : 0; 242 int numNamedArguments = namedArguments != null ? namedArguments.length : 0;
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 // The reflectee is not a mixin application. 563 // The reflectee is not a mixin application.
494 _mixin = this; 564 _mixin = this;
495 } else { 565 } else {
496 _mixin = reflectType(mixinType); 566 _mixin = reflectType(mixinType);
497 } 567 }
498 } 568 }
499 } 569 }
500 return _mixin; 570 return _mixin;
501 } 571 }
502 572
573 var _cachedStaticMembers;
574 Map<Symbol, MethodMirror> get staticMembers {
575 if (_cachedStaticMembers != null) return _cachedStaticMembers;
576 var result = new Map<Symbol, MethodMirror>();
577 declarations.values.forEach((decl) {
578 if (decl is MethodMirror && decl.isStatic &&
579 !decl.isConstructor && !decl.isAbstract) {
580 result[decl.simpleName] = decl;
581 }
582 if (decl is VariableMirror && decl.isStatic) {
583 var getterName = decl.simpleName;
584 result[getterName] =
585 new _SyntheticAccessor(this, getterName, true, true, false, decl);
586 if (!decl.isFinal) {
587 var setterName = _asSetter(decl.simpleName, this.owner);
588 result[setterName] = new _SyntheticAccessor(
589 this, setterName, false, true, false, decl);
590 }
591 }
592 });
593 return _cachedStaticMembers = result;
594 }
595
596 var _cachedInstanceMembers;
597 Map<Symbol, MethodMirror> get instanceMembers {
598 if (_cachedInstanceMembers != null) return _cachedInstanceMembers;
599 var result = new Map<Symbol, MethodMirror>();
600 if (superclass != null) {
601 result.addAll(superclass.instanceMembers);
602 }
603 declarations.values.forEach((decl) {
604 if (decl is MethodMirror && !decl.isStatic &&
605 !decl.isConstructor && !decl.isAbstract) {
606 result[decl.simpleName] = decl;
607 }
608 if (decl is VariableMirror && !decl.isStatic) {
609 var getterName = decl.simpleName;
610 result[getterName] =
611 new _SyntheticAccessor(this, getterName, true, false, false, decl);
612 if (!decl.isFinal) {
613 var setterName = _asSetter(decl.simpleName, this.owner);
614 result[setterName] = new _SyntheticAccessor(
615 this, setterName, false, false, false, decl);
616 }
617 }
618 });
619 return _cachedInstanceMembers = result;
620 }
621
503 Map<Symbol, DeclarationMirror> _declarations; 622 Map<Symbol, DeclarationMirror> _declarations;
504 Map<Symbol, DeclarationMirror> get declarations { 623 Map<Symbol, DeclarationMirror> get declarations {
505 if (_declarations != null) return _declarations; 624 if (_declarations != null) return _declarations;
506 var decls = new Map<Symbol, DeclarationMirror>(); 625 var decls = new Map<Symbol, DeclarationMirror>();
507 decls.addAll(members); 626 decls.addAll(members);
508 decls.addAll(constructors); 627 decls.addAll(constructors);
509 typeVariables.forEach((tv) => decls[tv.simpleName] = tv); 628 typeVariables.forEach((tv) => decls[tv.simpleName] = tv);
510 return _declarations = 629 return _declarations =
511 new _UnmodifiableMapView<Symbol, DeclarationMirror>(decls); 630 new _UnmodifiableMapView<Symbol, DeclarationMirror>(decls);
512 } 631 }
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
959 1078
960 String toString() => "TypedefMirror on '${_n(simpleName)}'"; 1079 String toString() => "TypedefMirror on '${_n(simpleName)}'";
961 1080
962 static _nativeReferent(reflectedType) 1081 static _nativeReferent(reflectedType)
963 native "TypedefMirror_referent"; 1082 native "TypedefMirror_referent";
964 1083
965 static _nativeDeclaration(reflectedType) 1084 static _nativeDeclaration(reflectedType)
966 native "TypedefMirror_declaration"; 1085 native "TypedefMirror_declaration";
967 } 1086 }
968 1087
969 class _LocalLibraryMirror extends _LocalObjectMirror 1088 Symbol _asSetter(Symbol getter, LibraryMirror library) {
970 implements LibraryMirror { 1089 var unwrapped = MirrorSystem.getName(getter);
1090 return MirrorSystem.getSymbol('${unwrapped}=', library);
1091 }
1092
1093 class _LocalLibraryMirror extends _LocalObjectMirror implements LibraryMirror {
971 final Symbol simpleName; 1094 final Symbol simpleName;
972 final Uri uri; 1095 final Uri uri;
973 1096
974 _LocalLibraryMirror(reflectee, 1097 _LocalLibraryMirror(reflectee,
975 String simpleName, 1098 String simpleName,
976 String url) 1099 String url)
977 : this.simpleName = _s(simpleName), 1100 : this.simpleName = _s(simpleName),
978 this.uri = Uri.parse(url), 1101 this.uri = Uri.parse(url),
979 super(reflectee); 1102 super(reflectee);
980 1103
981 // The simple name and the qualified name are the same for a library. 1104 // The simple name and the qualified name are the same for a library.
982 Symbol get qualifiedName => simpleName; 1105 Symbol get qualifiedName => simpleName;
983 1106
984 DeclarationMirror get owner => null; 1107 DeclarationMirror get owner => null;
985 1108
986 bool get isPrivate => false; 1109 bool get isPrivate => false;
987 bool get isTopLevel => false; 1110 bool get isTopLevel => false;
988 1111
989 Type get _instantiator => null; 1112 Type get _instantiator => null;
990 1113
991 SourceLocation get location { 1114 SourceLocation get location {
992 throw new UnimplementedError('LibraryMirror.location is not implemented'); 1115 throw new UnimplementedError('LibraryMirror.location is not implemented');
993 } 1116 }
994 1117
1118 var _cachedTopLevelMembers;
1119 Map<Symbol, MethodMirror> get topLevelMembers {
1120 if (_cachedTopLevelMembers != null) return _cachedTopLevelMembers;
1121 var result = new Map<Symbol, MethodMirror>();
1122 declarations.values.forEach((decl) {
1123 if (decl is MethodMirror && !decl.isAbstract) {
1124 result[decl.simpleName] = decl;
1125 }
1126 if (decl is VariableMirror) {
1127 var getterName = decl.simpleName;
1128 result[getterName] =
1129 new _SyntheticAccessor(this, getterName, true, true, true, decl);
1130 if (!decl.isFinal) {
1131 var setterName = _asSetter(decl.simpleName, this);
1132 result[setterName] = new _SyntheticAccessor(
1133 this, setterName, false, true, true, decl);
1134 }
1135 }
1136 if (decl is TypeMirror) {
1137 var getterName = decl.simpleName;
1138 result[getterName] = new _SyntheticTypeGetter(this, getterName, decl);
1139 }
1140 });
1141 return _cachedTopLevelMembers = result;
1142 }
1143
995 Map<Symbol, DeclarationMirror> _declarations; 1144 Map<Symbol, DeclarationMirror> _declarations;
996 Map<Symbol, DeclarationMirror> get declarations { 1145 Map<Symbol, DeclarationMirror> get declarations {
997 if (_declarations != null) return _declarations; 1146 if (_declarations != null) return _declarations;
998 return _declarations = 1147 return _declarations =
999 new _UnmodifiableMapView<Symbol, DeclarationMirror>(members); 1148 new _UnmodifiableMapView<Symbol, DeclarationMirror>(members);
1000 } 1149 }
1001 1150
1002 Map<Symbol, Mirror> _members; 1151 Map<Symbol, Mirror> _members;
1003 Map<Symbol, Mirror> get members { 1152 Map<Symbol, Mirror> get members {
1004 if (_members == null) { 1153 if (_members == null) {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1087 _invokeGetter(reflectee, getterName) 1236 _invokeGetter(reflectee, getterName)
1088 native 'LibraryMirror_invokeGetter'; 1237 native 'LibraryMirror_invokeGetter';
1089 1238
1090 _invokeSetter(reflectee, setterName, value) 1239 _invokeSetter(reflectee, setterName, value)
1091 native 'LibraryMirror_invokeSetter'; 1240 native 'LibraryMirror_invokeSetter';
1092 1241
1093 _computeMembers(reflectee) 1242 _computeMembers(reflectee)
1094 native "LibraryMirror_members"; 1243 native "LibraryMirror_members";
1095 } 1244 }
1096 1245
1097 class _LocalMethodMirror extends _LocalDeclarationMirror 1246 class _LocalMethodMirror extends _LocalDeclarationMirror
1098 implements MethodMirror { 1247 implements MethodMirror {
1099 final bool isStatic; 1248 final bool isStatic;
1100 final bool isAbstract; 1249 final bool isAbstract;
1101 final bool isGetter; 1250 final bool isGetter;
1102 final bool isSetter; 1251 final bool isSetter;
1103 final bool isConstructor; 1252 final bool isConstructor;
1104 final bool isConstConstructor; 1253 final bool isConstConstructor;
1105 final bool isGenerativeConstructor; 1254 final bool isGenerativeConstructor;
1106 final bool isRedirectingConstructor; 1255 final bool isRedirectingConstructor;
1107 final bool isFactoryConstructor; 1256 final bool isFactoryConstructor;
(...skipping 24 matching lines...) Expand all
1132 if (_owner == null) { 1281 if (_owner == null) {
1133 _owner = _MethodMirror_owner(_reflectee); 1282 _owner = _MethodMirror_owner(_reflectee);
1134 } 1283 }
1135 return _owner; 1284 return _owner;
1136 } 1285 }
1137 1286
1138 bool get isPrivate => _n(simpleName).startsWith('_') || 1287 bool get isPrivate => _n(simpleName).startsWith('_') ||
1139 _n(constructorName).startsWith('_'); 1288 _n(constructorName).startsWith('_');
1140 1289
1141 bool get isTopLevel => owner is LibraryMirror; 1290 bool get isTopLevel => owner is LibraryMirror;
1291 bool get isSynthetic => false;
1142 1292
1143 SourceLocation get location { 1293 SourceLocation get location {
1144 throw new UnimplementedError('MethodMirror.location is not implemented'); 1294 throw new UnimplementedError('MethodMirror.location is not implemented');
1145 } 1295 }
1146 1296
1147 Type get _instantiator { 1297 Type get _instantiator {
1148 var o = owner; 1298 var o = owner;
1149 while (o is MethodMirror) o = o.owner; 1299 while (o is MethodMirror) o = o.owner;
1150 return o._instantiator; 1300 return o._instantiator;
1151 } 1301 }
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
1425 if (typeMirror == null) { 1575 if (typeMirror == null) {
1426 typeMirror = makeLocalTypeMirror(key); 1576 typeMirror = makeLocalTypeMirror(key);
1427 _instanitationCache[key] = typeMirror; 1577 _instanitationCache[key] = typeMirror;
1428 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { 1578 if (typeMirror is ClassMirror && !typeMirror._isGeneric) {
1429 _declarationCache[key] = typeMirror; 1579 _declarationCache[key] = typeMirror;
1430 } 1580 }
1431 } 1581 }
1432 return typeMirror; 1582 return typeMirror;
1433 } 1583 }
1434 } 1584 }
OLDNEW
« no previous file with comments | « no previous file | sdk/lib/_internal/lib/js_mirrors.dart » ('j') | sdk/lib/_internal/lib/js_mirrors.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698