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"; | 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 buf.write(']'); | 101 buf.write(']'); |
102 } | 102 } |
103 buf.write(') -> '); | 103 buf.write(') -> '); |
104 buf.write(_n(returnType.qualifiedName)); | 104 buf.write(_n(returnType.qualifiedName)); |
105 return buf.toString(); | 105 return buf.toString(); |
106 } | 106 } |
107 | 107 |
108 List _metadata(reflectee) | 108 List _metadata(reflectee) |
109 native 'DeclarationMirror_metadata'; | 109 native 'DeclarationMirror_metadata'; |
110 | 110 |
| 111 bool _subtypeTest(Type a, Type b) |
| 112 native 'TypeMirror_subtypeTest'; |
| 113 |
| 114 bool _moreSpecificTest(Type a, Type b) |
| 115 native 'TypeMirror_moreSpecificTest'; |
| 116 |
111 class _LocalMirrorSystem extends MirrorSystem { | 117 class _LocalMirrorSystem extends MirrorSystem { |
112 final Map<Uri, LibraryMirror> libraries; | 118 final Map<Uri, LibraryMirror> libraries; |
113 final IsolateMirror isolate; | 119 final IsolateMirror isolate; |
114 | 120 |
115 _LocalMirrorSystem(List<LibraryMirror> libraries, this.isolate) | 121 _LocalMirrorSystem(List<LibraryMirror> libraries, this.isolate) |
116 : this.libraries = new Map<Uri, LibraryMirror>.fromIterable( | 122 : this.libraries = new Map<Uri, LibraryMirror>.fromIterable( |
117 libraries, key: (e) => e.uri); | 123 libraries, key: (e) => e.uri); |
118 | 124 |
119 TypeMirror _dynamicType = null; | 125 TypeMirror _dynamicType = null; |
120 TypeMirror get dynamicType { | 126 TypeMirror get dynamicType { |
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 | 759 |
754 bool operator ==(other) { | 760 bool operator ==(other) { |
755 return this.runtimeType == other.runtimeType && | 761 return this.runtimeType == other.runtimeType && |
756 this._reflectee == other._reflectee && | 762 this._reflectee == other._reflectee && |
757 this._reflectedType == other._reflectedType && | 763 this._reflectedType == other._reflectedType && |
758 this._isGenericDeclaration == other._isGenericDeclaration; | 764 this._isGenericDeclaration == other._isGenericDeclaration; |
759 } | 765 } |
760 | 766 |
761 int get hashCode => simpleName.hashCode; | 767 int get hashCode => simpleName.hashCode; |
762 | 768 |
| 769 bool isSubtypeOf(TypeMirror other) { |
| 770 if (other == currentMirrorSystem().dynamicType) return true; |
| 771 if (other == currentMirrorSystem().voidType) return false; |
| 772 return _subtypeTest(_reflectedType, other._reflectedType); |
| 773 } |
| 774 |
| 775 bool isAssignableTo(TypeMirror other) { |
| 776 if (other == currentMirrorSystem().dynamicType) return true; |
| 777 if (other == currentMirrorSystem().voidType) return false; |
| 778 return _moreSpecificTest(_reflectedType, other._reflectedType) |
| 779 || _moreSpecificTest(other._reflectedType, _reflectedType); |
| 780 } |
| 781 |
| 782 bool isSubclassOf(ClassMirror other) { |
| 783 if (other is! ClassMirror) throw new ArgumentError(other); |
| 784 ClassMirror otherDeclaration = other.originalDeclaration; |
| 785 ClassMirror c = this; |
| 786 while (c != null) { |
| 787 c = c.originalDeclaration; |
| 788 if (c == otherDeclaration) return true; |
| 789 c = c.superclass; |
| 790 } |
| 791 return false; |
| 792 } |
| 793 |
763 static _library(reflectee) | 794 static _library(reflectee) |
764 native "ClassMirror_library"; | 795 native "ClassMirror_library"; |
765 | 796 |
766 static _supertype(reflectedType) | 797 static _supertype(reflectedType) |
767 native "ClassMirror_supertype"; | 798 native "ClassMirror_supertype"; |
768 | 799 |
769 static _supertypeInstantiated(reflectedType) | 800 static _supertypeInstantiated(reflectedType) |
770 native "ClassMirror_supertype_instantiated"; | 801 native "ClassMirror_supertype_instantiated"; |
771 | 802 |
772 static _nativeInterfaces(reflectedType) | 803 static _nativeInterfaces(reflectedType) |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
925 | 956 |
926 TypeMirror _upperBound = null; | 957 TypeMirror _upperBound = null; |
927 TypeMirror get upperBound { | 958 TypeMirror get upperBound { |
928 if (_upperBound == null) { | 959 if (_upperBound == null) { |
929 _upperBound = reflectType(_TypeVariableMirror_upper_bound(_reflectee)); | 960 _upperBound = reflectType(_TypeVariableMirror_upper_bound(_reflectee)); |
930 } | 961 } |
931 return _upperBound; | 962 return _upperBound; |
932 } | 963 } |
933 | 964 |
934 bool get hasReflectedType => false; | 965 bool get hasReflectedType => false; |
935 Type get reflectedType => throw new UnsupportedError() ; | 966 Type get reflectedType => throw new UnsupportedError(); |
| 967 Type get _reflectedType => _reflectee; |
936 | 968 |
937 List<TypeVariableMirror> get typeVariables => emptyList; | 969 List<TypeVariableMirror> get typeVariables => emptyList; |
938 List<TypeMirror> get typeArguments => emptyList; | 970 List<TypeMirror> get typeArguments => emptyList; |
939 | 971 |
940 bool get isOriginalDeclaration => true; | 972 bool get isOriginalDeclaration => true; |
941 TypeMirror get originalDeclaration => this; | 973 TypeMirror get originalDeclaration => this; |
942 | 974 |
943 String toString() => "TypeVariableMirror on '${_n(simpleName)}'"; | 975 String toString() => "TypeVariableMirror on '${_n(simpleName)}'"; |
944 | 976 |
945 operator ==(other) { | 977 operator ==(other) { |
946 return other is TypeVariableMirror | 978 return other is TypeVariableMirror |
947 && simpleName == other.simpleName | 979 && simpleName == other.simpleName |
948 && owner == other.owner; | 980 && owner == other.owner; |
949 } | 981 } |
950 int get hashCode => simpleName.hashCode; | 982 int get hashCode => simpleName.hashCode; |
951 | 983 |
| 984 bool isSubtypeOf(TypeMirror other) { |
| 985 if (other == currentMirrorSystem().dynamicType) return true; |
| 986 if (other == currentMirrorSystem().voidType) return false; |
| 987 return _subtypeTest(_reflectedType, other._reflectedType); |
| 988 } |
| 989 |
| 990 bool isAssignableTo(TypeMirror other) { |
| 991 if (other == currentMirrorSystem().dynamicType) return true; |
| 992 if (other == currentMirrorSystem().voidType) return false; |
| 993 return _moreSpecificTest(_reflectedType, other._reflectedType) |
| 994 || _moreSpecificTest(other._reflectedType, _reflectedType); |
| 995 } |
| 996 |
952 static DeclarationMirror _TypeVariableMirror_owner(reflectee) | 997 static DeclarationMirror _TypeVariableMirror_owner(reflectee) |
953 native "TypeVariableMirror_owner"; | 998 native "TypeVariableMirror_owner"; |
954 | 999 |
955 static Type _TypeVariableMirror_upper_bound(reflectee) | 1000 static Type _TypeVariableMirror_upper_bound(reflectee) |
956 native "TypeVariableMirror_upper_bound"; | 1001 native "TypeVariableMirror_upper_bound"; |
957 } | 1002 } |
958 | 1003 |
959 | 1004 |
960 class _LocalTypedefMirror extends _LocalDeclarationMirror | 1005 class _LocalTypedefMirror extends _LocalDeclarationMirror |
961 implements TypedefMirror { | 1006 implements TypedefMirror { |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1029 } else { | 1074 } else { |
1030 _typeArguments = new UnmodifiableListView( | 1075 _typeArguments = new UnmodifiableListView( |
1031 _LocalClassMirror._computeTypeArguments(_reflectedType)); | 1076 _LocalClassMirror._computeTypeArguments(_reflectedType)); |
1032 } | 1077 } |
1033 } | 1078 } |
1034 return _typeArguments; | 1079 return _typeArguments; |
1035 } | 1080 } |
1036 | 1081 |
1037 String toString() => "TypedefMirror on '${_n(simpleName)}'"; | 1082 String toString() => "TypedefMirror on '${_n(simpleName)}'"; |
1038 | 1083 |
| 1084 bool isSubtypeOf(TypeMirror other) { |
| 1085 if (other == currentMirrorSystem().dynamicType) return true; |
| 1086 if (other == currentMirrorSystem().voidType) return false; |
| 1087 return _subtypeTest(_reflectedType, other._reflectedType); |
| 1088 } |
| 1089 |
| 1090 bool isAssignableTo(TypeMirror other) { |
| 1091 if (other == currentMirrorSystem().dynamicType) return true; |
| 1092 if (other == currentMirrorSystem().voidType) return false; |
| 1093 return _moreSpecificTest(_reflectedType, other._reflectedType) |
| 1094 || _moreSpecificTest(other._reflectedType, _reflectedType); |
| 1095 } |
| 1096 |
1039 static _nativeReferent(reflectedType) | 1097 static _nativeReferent(reflectedType) |
1040 native "TypedefMirror_referent"; | 1098 native "TypedefMirror_referent"; |
1041 | 1099 |
1042 static _nativeDeclaration(reflectedType) | 1100 static _nativeDeclaration(reflectedType) |
1043 native "TypedefMirror_declaration"; | 1101 native "TypedefMirror_declaration"; |
1044 } | 1102 } |
1045 | 1103 |
1046 Symbol _asSetter(Symbol getter, LibraryMirror library) { | 1104 Symbol _asSetter(Symbol getter, LibraryMirror library) { |
1047 var unwrapped = MirrorSystem.getName(getter); | 1105 var unwrapped = MirrorSystem.getName(getter); |
1048 return MirrorSystem.getSymbol('${unwrapped}=', library); | 1106 return MirrorSystem.getSymbol('${unwrapped}=', library); |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1434 bool operator ==(other) { | 1492 bool operator ==(other) { |
1435 if (other is! _SpecialTypeMirror) { | 1493 if (other is! _SpecialTypeMirror) { |
1436 return false; | 1494 return false; |
1437 } | 1495 } |
1438 return this.simpleName == other.simpleName; | 1496 return this.simpleName == other.simpleName; |
1439 } | 1497 } |
1440 | 1498 |
1441 int get hashCode => simpleName.hashCode; | 1499 int get hashCode => simpleName.hashCode; |
1442 | 1500 |
1443 String toString() => "TypeMirror on '${_n(simpleName)}'"; | 1501 String toString() => "TypeMirror on '${_n(simpleName)}'"; |
| 1502 |
| 1503 bool isSubtypeOf(TypeMirror other) { |
| 1504 return this == other || |
| 1505 (other is _SpecialTypeMirror && other.simpleName == #dynamic); |
| 1506 } |
| 1507 |
| 1508 bool isAssignableTo(TypeMirror other) { |
| 1509 return simpleName == #dynamic || other is _SpecialTypeMirror; |
| 1510 } |
1444 } | 1511 } |
1445 | 1512 |
1446 class _Mirrors { | 1513 class _Mirrors { |
1447 static MirrorSystem _currentMirrorSystem = null; | 1514 static MirrorSystem _currentMirrorSystem = null; |
1448 | 1515 |
1449 // Creates a new local MirrorSystem. | 1516 // Creates a new local MirrorSystem. |
1450 static MirrorSystem makeLocalMirrorSystem() | 1517 static MirrorSystem makeLocalMirrorSystem() |
1451 native 'Mirrors_makeLocalMirrorSystem'; | 1518 native 'Mirrors_makeLocalMirrorSystem'; |
1452 | 1519 |
1453 // The MirrorSystem for the current isolate. | 1520 // The MirrorSystem for the current isolate. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1490 if (typeMirror == null) { | 1557 if (typeMirror == null) { |
1491 typeMirror = makeLocalTypeMirror(key); | 1558 typeMirror = makeLocalTypeMirror(key); |
1492 _instanitationCache[key] = typeMirror; | 1559 _instanitationCache[key] = typeMirror; |
1493 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { | 1560 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { |
1494 _declarationCache[key] = typeMirror; | 1561 _declarationCache[key] = typeMirror; |
1495 } | 1562 } |
1496 } | 1563 } |
1497 return typeMirror; | 1564 return typeMirror; |
1498 } | 1565 } |
1499 } | 1566 } |
OLD | NEW |