OLD | NEW |
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" show UnmodifiableListView, UnmodifiableMapView; | 7 import "dart:collection" show UnmodifiableListView, UnmodifiableMapView; |
8 | 8 |
9 final emptyList = new UnmodifiableListView([]); | 9 final emptyList = new UnmodifiableListView([]); |
10 final emptyMap = new UnmodifiableMapView({}); | 10 final emptyMap = new UnmodifiableMapView({}); |
11 | 11 |
12 class _InternalMirrorError { | 12 class _InternalMirrorError { |
13 final String _msg; | 13 final String _msg; |
14 const _InternalMirrorError(String this._msg); | 14 const _InternalMirrorError(String this._msg); |
15 String toString() => _msg; | 15 String toString() => _msg; |
16 } | 16 } |
17 | 17 |
18 Map _makeMemberMap(List mirrors) { | |
19 return new UnmodifiableMapView<Symbol, DeclarationMirror>( | |
20 new Map<Symbol, DeclarationMirror>.fromIterable( | |
21 mirrors, key: (e) => e.simpleName)); | |
22 } | |
23 | |
24 String _n(Symbol symbol) => _symbol_dev.Symbol.getName(symbol); | 18 String _n(Symbol symbol) => _symbol_dev.Symbol.getName(symbol); |
25 | 19 |
26 Symbol _s(String name) { | 20 Symbol _s(String name) { |
27 if (name == null) return null; | 21 if (name == null) return null; |
28 return new _symbol_dev.Symbol.unvalidated(name); | 22 return new _symbol_dev.Symbol.unvalidated(name); |
29 } | 23 } |
30 | 24 |
31 Symbol _computeQualifiedName(DeclarationMirror owner, Symbol simpleName) { | 25 Symbol _computeQualifiedName(DeclarationMirror owner, Symbol simpleName) { |
32 if (owner == null) return simpleName; | 26 if (owner == null) return simpleName; |
33 return _s('${_n(owner.qualifiedName)}.${_n(simpleName)}'); | 27 return _s('${_n(owner.qualifiedName)}.${_n(simpleName)}'); |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 Symbol _qualifiedName = null; | 609 Symbol _qualifiedName = null; |
616 Symbol get qualifiedName { | 610 Symbol get qualifiedName { |
617 if (_qualifiedName == null) { | 611 if (_qualifiedName == null) { |
618 _qualifiedName = _computeQualifiedName(owner, simpleName); | 612 _qualifiedName = _computeQualifiedName(owner, simpleName); |
619 } | 613 } |
620 return _qualifiedName; | 614 return _qualifiedName; |
621 } | 615 } |
622 | 616 |
623 DeclarationMirror get owner { | 617 DeclarationMirror get owner { |
624 if (_owner == null) { | 618 if (_owner == null) { |
625 _owner = _library(_reflectee); | 619 var uri = _LocalClassMirror._libraryUri(_reflectee); |
| 620 _owner = currentMirrorSystem().libraries[Uri.parse(uri)]; |
626 } | 621 } |
627 return _owner; | 622 return _owner; |
628 } | 623 } |
629 | 624 |
630 bool get isPrivate => _n(simpleName).startsWith('_'); | 625 bool get isPrivate => _n(simpleName).startsWith('_'); |
631 | 626 |
632 final bool isTopLevel = true; | 627 bool get isTopLevel => true; |
633 | 628 |
634 SourceLocation get location { | 629 SourceLocation get location { |
635 return _location(_reflectee); | 630 return _location(_reflectee); |
636 } | 631 } |
637 | 632 |
638 ClassMirror _trueSuperclassField; | 633 ClassMirror _trueSuperclassField; |
639 ClassMirror get _trueSuperclass { | 634 ClassMirror get _trueSuperclass { |
640 if (_trueSuperclassField == null) { | 635 if (_trueSuperclassField == null) { |
641 Type supertype = isOriginalDeclaration | 636 Type supertype = isOriginalDeclaration |
642 ? _supertype(_reflectedType) | 637 ? _supertype(_reflectedType) |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 }); | 745 }); |
751 _cachedInstanceMembers = | 746 _cachedInstanceMembers = |
752 new UnmodifiableMapView<Symbol, MethodMirror>(result); | 747 new UnmodifiableMapView<Symbol, MethodMirror>(result); |
753 } | 748 } |
754 return _cachedInstanceMembers; | 749 return _cachedInstanceMembers; |
755 } | 750 } |
756 | 751 |
757 Map<Symbol, DeclarationMirror> _declarations; | 752 Map<Symbol, DeclarationMirror> _declarations; |
758 Map<Symbol, DeclarationMirror> get declarations { | 753 Map<Symbol, DeclarationMirror> get declarations { |
759 if (_declarations != null) return _declarations; | 754 if (_declarations != null) return _declarations; |
| 755 |
760 var decls = new Map<Symbol, DeclarationMirror>(); | 756 var decls = new Map<Symbol, DeclarationMirror>(); |
761 decls.addAll(_members); | 757 |
762 decls.addAll(_constructors); | 758 var whoseMembers = _isMixinAlias ? _trueSuperclass : this; |
763 typeVariables.forEach((tv) => decls[tv.simpleName] = tv); | 759 var members = mixin._computeMembers(_instantiator, |
| 760 whoseMembers.mixin._reflectee); |
| 761 for (var member in members) { |
| 762 decls[member.simpleName] = member; |
| 763 } |
| 764 |
| 765 var constructors = _computeConstructors(_instantiator, _reflectee); |
| 766 var stringName = _n(simpleName); |
| 767 for (var constructor in constructors) { |
| 768 constructor._patchConstructorName(stringName); |
| 769 decls[constructor.simpleName] = constructor; |
| 770 } |
| 771 |
| 772 for (var typeVariable in typeVariables) { |
| 773 decls[typeVariable.simpleName] = typeVariable; |
| 774 } |
| 775 |
764 return _declarations = | 776 return _declarations = |
765 new UnmodifiableMapView<Symbol, DeclarationMirror>(decls); | 777 new UnmodifiableMapView<Symbol, DeclarationMirror>(decls); |
766 } | 778 } |
767 | 779 |
768 Map<Symbol, Mirror> _cachedMembers; | |
769 Map<Symbol, Mirror> get _members { | |
770 if (_cachedMembers == null) { | |
771 var whoseMembers = _isMixinAlias ? _trueSuperclass : this; | |
772 _cachedMembers = _makeMemberMap(mixin._computeMembers( | |
773 _instantiator, whoseMembers.mixin._reflectee)); | |
774 } | |
775 return _cachedMembers; | |
776 } | |
777 | |
778 Map<Symbol, MethodMirror> _cachedConstructors; | |
779 Map<Symbol, MethodMirror> get _constructors { | |
780 if (_cachedConstructors == null) { | |
781 var constructorsList = _computeConstructors(_instantiator, _reflectee); | |
782 var stringName = _n(simpleName); | |
783 constructorsList.forEach((c) => c._patchConstructorName(stringName)); | |
784 _cachedConstructors = | |
785 new Map.fromIterable(constructorsList, key: (e) => e.simpleName); | |
786 } | |
787 return _cachedConstructors; | |
788 } | |
789 | |
790 bool get _isAnonymousMixinApplication { | 780 bool get _isAnonymousMixinApplication { |
791 if (_isMixinAlias) return false; // Named mixin application. | 781 if (_isMixinAlias) return false; // Named mixin application. |
792 if (mixin == this) return false; // Not a mixin application. | 782 if (mixin == this) return false; // Not a mixin application. |
793 return true; | 783 return true; |
794 } | 784 } |
795 | 785 |
796 List<TypeVariableMirror> _typeVariables = null; | 786 List<TypeVariableMirror> _typeVariables = null; |
797 List<TypeVariableMirror> get typeVariables { | 787 List<TypeVariableMirror> get typeVariables { |
798 if (_typeVariables == null) { | 788 if (_typeVariables == null) { |
799 if (_isAnonymousMixinApplication) return _typeVariables = emptyList; | 789 if (_isAnonymousMixinApplication) return _typeVariables = emptyList; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 ClassMirror otherDeclaration = other.originalDeclaration; | 887 ClassMirror otherDeclaration = other.originalDeclaration; |
898 ClassMirror c = this; | 888 ClassMirror c = this; |
899 while (c != null) { | 889 while (c != null) { |
900 c = c.originalDeclaration; | 890 c = c.originalDeclaration; |
901 if (c == otherDeclaration) return true; | 891 if (c == otherDeclaration) return true; |
902 c = c.superclass; | 892 c = c.superclass; |
903 } | 893 } |
904 return false; | 894 return false; |
905 } | 895 } |
906 | 896 |
907 static _library(reflectee) | 897 static _libraryUri(reflectee) |
908 native "ClassMirror_library"; | 898 native "ClassMirror_libraryUri"; |
909 | 899 |
910 static _supertype(reflectedType) | 900 static _supertype(reflectedType) |
911 native "ClassMirror_supertype"; | 901 native "ClassMirror_supertype"; |
912 | 902 |
913 static _supertypeInstantiated(reflectedType) | 903 static _supertypeInstantiated(reflectedType) |
914 native "ClassMirror_supertype_instantiated"; | 904 native "ClassMirror_supertype_instantiated"; |
915 | 905 |
916 static _nativeInterfaces(reflectedType) | 906 static _nativeInterfaces(reflectedType) |
917 native "ClassMirror_interfaces"; | 907 native "ClassMirror_interfaces"; |
918 | 908 |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1127 this._isGeneric, | 1117 this._isGeneric, |
1128 this._isGenericDeclaration, | 1118 this._isGenericDeclaration, |
1129 this._owner) | 1119 this._owner) |
1130 : super(reflectee, _s(simpleName)); | 1120 : super(reflectee, _s(simpleName)); |
1131 | 1121 |
1132 bool get isTopLevel => true; | 1122 bool get isTopLevel => true; |
1133 | 1123 |
1134 DeclarationMirror _owner; | 1124 DeclarationMirror _owner; |
1135 DeclarationMirror get owner { | 1125 DeclarationMirror get owner { |
1136 if (_owner == null) { | 1126 if (_owner == null) { |
1137 _owner = _LocalClassMirror._library(_reflectee); | 1127 var uri = _LocalClassMirror._libraryUri(_reflectee); |
| 1128 _owner = currentMirrorSystem().libraries[Uri.parse(uri)]; |
1138 } | 1129 } |
1139 return _owner; | 1130 return _owner; |
1140 } | 1131 } |
1141 | 1132 |
1142 TypeMirror _referent = null; | 1133 TypeMirror _referent = null; |
1143 TypeMirror get referent { | 1134 TypeMirror get referent { |
1144 if (_referent == null) { | 1135 if (_referent == null) { |
1145 _referent = _nativeReferent(_reflectedType); | 1136 _referent = _nativeReferent(_reflectedType); |
1146 _referent._instantiator = _reflectedType; | 1137 _referent._instantiator = _reflectedType; |
1147 } | 1138 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1240 DeclarationMirror get owner => null; | 1231 DeclarationMirror get owner => null; |
1241 | 1232 |
1242 bool get isPrivate => false; | 1233 bool get isPrivate => false; |
1243 bool get isTopLevel => false; | 1234 bool get isTopLevel => false; |
1244 | 1235 |
1245 Type get _instantiator => null; | 1236 Type get _instantiator => null; |
1246 | 1237 |
1247 Map<Symbol, DeclarationMirror> _declarations; | 1238 Map<Symbol, DeclarationMirror> _declarations; |
1248 Map<Symbol, DeclarationMirror> get declarations { | 1239 Map<Symbol, DeclarationMirror> get declarations { |
1249 if (_declarations != null) return _declarations; | 1240 if (_declarations != null) return _declarations; |
| 1241 |
| 1242 var decls = new Map<Symbol, DeclarationMirror>(); |
| 1243 var members = _computeMembers(_reflectee); |
| 1244 for (var member in members) { |
| 1245 decls[member.simpleName] = member; |
| 1246 } |
| 1247 |
1250 return _declarations = | 1248 return _declarations = |
1251 new UnmodifiableMapView<Symbol, DeclarationMirror>(_members); | 1249 new UnmodifiableMapView<Symbol, DeclarationMirror>(decls); |
1252 } | |
1253 | |
1254 Map<Symbol, Mirror> _cachedMembers; | |
1255 Map<Symbol, Mirror> get _members { | |
1256 if (_cachedMembers == null) { | |
1257 _cachedMembers = _makeMemberMap(_computeMembers(_reflectee)); | |
1258 } | |
1259 return _cachedMembers; | |
1260 } | 1250 } |
1261 | 1251 |
1262 SourceLocation get location { | 1252 SourceLocation get location { |
1263 return _location(_reflectee); | 1253 return _location(_reflectee); |
1264 } | 1254 } |
1265 | 1255 |
1266 List<InstanceMirror> get metadata { | 1256 List<InstanceMirror> get metadata { |
1267 // Get the metadata objects, convert them into InstanceMirrors using | 1257 // Get the metadata objects, convert them into InstanceMirrors using |
1268 // reflect() and then make them into a Dart list. | 1258 // reflect() and then make them into a Dart list. |
1269 return new UnmodifiableListView(_metadata(_reflectee).map(reflect)); | 1259 return new UnmodifiableListView(_metadata(_reflectee).map(reflect)); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1332 _LocalCombinatorMirror(identifierString, this.isShow) | 1322 _LocalCombinatorMirror(identifierString, this.isShow) |
1333 : this.identifiers = [_s(identifierString)]; | 1323 : this.identifiers = [_s(identifierString)]; |
1334 | 1324 |
1335 bool get isHide => !isShow; | 1325 bool get isHide => !isShow; |
1336 } | 1326 } |
1337 | 1327 |
1338 class _LocalMethodMirror extends _LocalDeclarationMirror | 1328 class _LocalMethodMirror extends _LocalDeclarationMirror |
1339 implements MethodMirror { | 1329 implements MethodMirror { |
1340 final Type _instantiator; | 1330 final Type _instantiator; |
1341 final bool isStatic; | 1331 final bool isStatic; |
1342 final bool isAbstract; | 1332 final int _kindFlags; |
1343 final bool isGetter; | |
1344 final bool isSetter; | |
1345 final bool isConstructor; | |
1346 final bool isConstConstructor; | |
1347 final bool isGenerativeConstructor; | |
1348 final bool isRedirectingConstructor; | |
1349 final bool isFactoryConstructor; | |
1350 final bool isOperator; | |
1351 | |
1352 static const _operators = const ["%", "&", "*", "+", "-", "/", "<", "<<", | |
1353 "<=", "==", ">", ">=", ">>", "[]", "[]=", "^", "|", "~", "unary-", "~/"]; | |
1354 | 1333 |
1355 _LocalMethodMirror(reflectee, | 1334 _LocalMethodMirror(reflectee, |
1356 String simpleName, | 1335 String simpleName, |
1357 this._owner, | 1336 this._owner, |
1358 this._instantiator, | 1337 this._instantiator, |
1359 this.isStatic, | 1338 this.isStatic, |
1360 this.isAbstract, | 1339 this._kindFlags) |
1361 this.isGetter, | 1340 : super(reflectee, _s(simpleName)); |
1362 this.isSetter, | 1341 |
1363 this.isConstructor, | 1342 static const kAbstract = 0; |
1364 this.isConstConstructor, | 1343 static const kGetter = 1; |
1365 this.isGenerativeConstructor, | 1344 static const kSetter = 2; |
1366 this.isRedirectingConstructor, | 1345 static const kConstructor = 3; |
1367 this.isFactoryConstructor) | 1346 static const kConstCtor = 4; |
1368 : this.isOperator = _operators.contains(simpleName), | 1347 static const kGenerativeCtor = 5; |
1369 super(reflectee, _s(simpleName)); | 1348 static const kRedirectingCtor = 6; |
| 1349 static const kFactoryCtor = 7; |
| 1350 |
| 1351 // These offsets much be kept in sync with those in mirrors.h. |
| 1352 bool get isAbstract => 0 != (_kindFlags & (1 << kAbstract)); |
| 1353 bool get isGetter => 0 != (_kindFlags & (1 << kGetter)); |
| 1354 bool get isSetter => 0 != (_kindFlags & (1 << kSetter)); |
| 1355 bool get isConstructor => 0 != (_kindFlags & (1 << kConstructor)); |
| 1356 bool get isConstConstructor => 0 != (_kindFlags & (1 << kConstCtor)); |
| 1357 bool get isGenerativeConstructor => 0 != (_kindFlags & (1 << kGenerativeCtor)
); |
| 1358 bool get isRedirectingConstructor => 0 != (_kindFlags & (1 << kRedirectingCtor
)); |
| 1359 bool get isFactoryConstructor => 0 != (_kindFlags & (1 << kFactoryCtor)); |
| 1360 |
| 1361 static const _operators = const ["%", "&", "*", "+", "-", "/", "<", "<<", |
| 1362 "<=", "==", ">", ">=", ">>", "[]", "[]=", "^", "|", "~", "unary-", "~/"]; |
| 1363 bool get isOperator => _operators.contains(_n(simpleName)); |
1370 | 1364 |
1371 DeclarationMirror _owner; | 1365 DeclarationMirror _owner; |
1372 DeclarationMirror get owner { | 1366 DeclarationMirror get owner { |
1373 // For nested closures it is possible, that the mirror for the owner has not | 1367 // For nested closures it is possible, that the mirror for the owner has not |
1374 // been created yet. | 1368 // been created yet. |
1375 if (_owner == null) { | 1369 if (_owner == null) { |
1376 _owner = _MethodMirror_owner(_reflectee, _instantiator); | 1370 _owner = _MethodMirror_owner(_reflectee, _instantiator); |
1377 } | 1371 } |
1378 return _owner; | 1372 return _owner; |
1379 } | 1373 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1423 LibraryMirror definingLibrary = owner.owner; | 1417 LibraryMirror definingLibrary = owner.owner; |
1424 _constructorName = MirrorSystem.getSymbol(parts[1], definingLibrary); | 1418 _constructorName = MirrorSystem.getSymbol(parts[1], definingLibrary); |
1425 } else { | 1419 } else { |
1426 _constructorName = _s(''); | 1420 _constructorName = _s(''); |
1427 } | 1421 } |
1428 } | 1422 } |
1429 } | 1423 } |
1430 return _constructorName; | 1424 return _constructorName; |
1431 } | 1425 } |
1432 | 1426 |
1433 String _source = null; | 1427 String get source => _MethodMirror_source(_reflectee); |
1434 String get source { | |
1435 if (_source == null) { | |
1436 _source = _MethodMirror_source(_reflectee); | |
1437 } | |
1438 return _source; | |
1439 } | |
1440 | 1428 |
1441 void _patchConstructorName(ownerName) { | 1429 void _patchConstructorName(ownerName) { |
1442 var cn = _n(constructorName); | 1430 var cn = _n(constructorName); |
1443 if(cn == ''){ | 1431 if (cn == '') { |
1444 _simpleName = _s(ownerName); | 1432 _simpleName = _s(ownerName); |
1445 } else { | 1433 } else { |
1446 _simpleName = _s(ownerName + "." + cn); | 1434 _simpleName = _s(ownerName + "." + cn); |
1447 } | 1435 } |
1448 } | 1436 } |
1449 | 1437 |
1450 String toString() => "MethodMirror on '${MirrorSystem.getName(simpleName)}'"; | 1438 String toString() => "MethodMirror on '${MirrorSystem.getName(simpleName)}'"; |
1451 | 1439 |
1452 static dynamic _MethodMirror_owner(reflectee, instantiator) | 1440 static dynamic _MethodMirror_owner(reflectee, instantiator) |
1453 native "MethodMirror_owner"; | 1441 native "MethodMirror_owner"; |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1662 if (typeMirror == null) { | 1650 if (typeMirror == null) { |
1663 typeMirror = makeLocalTypeMirror(key); | 1651 typeMirror = makeLocalTypeMirror(key); |
1664 _instanitationCache[key] = typeMirror; | 1652 _instanitationCache[key] = typeMirror; |
1665 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { | 1653 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { |
1666 _declarationCache[key] = typeMirror; | 1654 _declarationCache[key] = typeMirror; |
1667 } | 1655 } |
1668 } | 1656 } |
1669 return typeMirror; | 1657 return typeMirror; |
1670 } | 1658 } |
1671 } | 1659 } |
OLD | NEW |