| 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 buf.write(']'); | 102 buf.write(']'); |
| 103 } | 103 } |
| 104 buf.write(') -> '); | 104 buf.write(') -> '); |
| 105 buf.write(_n(returnType.qualifiedName)); | 105 buf.write(_n(returnType.qualifiedName)); |
| 106 return buf.toString(); | 106 return buf.toString(); |
| 107 } | 107 } |
| 108 | 108 |
| 109 List _metadata(reflectee) | 109 List _metadata(reflectee) |
| 110 native 'DeclarationMirror_metadata'; | 110 native 'DeclarationMirror_metadata'; |
| 111 | 111 |
| 112 bool _subtypeTest(Type a, Type b) |
| 113 native 'TypeMirror_subtypeTest'; |
| 114 |
| 115 bool _moreSpecificTest(Type a, Type b) |
| 116 native 'TypeMirror_moreSpecificTest'; |
| 117 |
| 112 class _LocalMirrorSystem extends MirrorSystem { | 118 class _LocalMirrorSystem extends MirrorSystem { |
| 113 final Map<Uri, LibraryMirror> libraries; | 119 final Map<Uri, LibraryMirror> libraries; |
| 114 final IsolateMirror isolate; | 120 final IsolateMirror isolate; |
| 115 | 121 |
| 116 _LocalMirrorSystem(List<LibraryMirror> libraries, this.isolate) | 122 _LocalMirrorSystem(List<LibraryMirror> libraries, this.isolate) |
| 117 : this.libraries = new Map<Uri, LibraryMirror>.fromIterable( | 123 : this.libraries = new Map<Uri, LibraryMirror>.fromIterable( |
| 118 libraries, key: (e) => e.uri); | 124 libraries, key: (e) => e.uri); |
| 119 | 125 |
| 120 TypeMirror _dynamicType = null; | 126 TypeMirror _dynamicType = null; |
| 121 TypeMirror get dynamicType { | 127 TypeMirror get dynamicType { |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 | 850 |
| 845 bool operator ==(other) { | 851 bool operator ==(other) { |
| 846 return this.runtimeType == other.runtimeType && | 852 return this.runtimeType == other.runtimeType && |
| 847 this._reflectee == other._reflectee && | 853 this._reflectee == other._reflectee && |
| 848 this._reflectedType == other._reflectedType && | 854 this._reflectedType == other._reflectedType && |
| 849 this._isGenericDeclaration == other._isGenericDeclaration; | 855 this._isGenericDeclaration == other._isGenericDeclaration; |
| 850 } | 856 } |
| 851 | 857 |
| 852 int get hashCode => simpleName.hashCode; | 858 int get hashCode => simpleName.hashCode; |
| 853 | 859 |
| 860 bool isSubtypeOf(TypeMirror other) { |
| 861 if (other == currentMirrorSystem().dynamicType) return true; |
| 862 if (other == currentMirrorSystem().voidType) return false; |
| 863 return _subtypeTest(_reflectedType, other._reflectedType); |
| 864 } |
| 865 |
| 866 bool isAssignableTo(TypeMirror other) { |
| 867 if (other == currentMirrorSystem().dynamicType) return true; |
| 868 if (other == currentMirrorSystem().voidType) return false; |
| 869 return _moreSpecificTest(_reflectedType, other._reflectedType) |
| 870 || _moreSpecificTest(other._reflectedType, _reflectedType); |
| 871 } |
| 872 |
| 873 bool isSubclassOf(ClassMirror other) { |
| 874 if (other is! ClassMirror) throw new ArgumentError(other); |
| 875 ClassMirror otherDeclaration = other.originalDeclaration; |
| 876 ClassMirror c = this; |
| 877 while (c != null) { |
| 878 c = c.originalDeclaration; |
| 879 if (c == otherDeclaration) return true; |
| 880 c = c.superclass; |
| 881 } |
| 882 return false; |
| 883 } |
| 884 |
| 854 static _library(reflectee) | 885 static _library(reflectee) |
| 855 native "ClassMirror_library"; | 886 native "ClassMirror_library"; |
| 856 | 887 |
| 857 static _supertype(reflectedType) | 888 static _supertype(reflectedType) |
| 858 native "ClassMirror_supertype"; | 889 native "ClassMirror_supertype"; |
| 859 | 890 |
| 860 static _supertypeInstantiated(reflectedType) | 891 static _supertypeInstantiated(reflectedType) |
| 861 native "ClassMirror_supertype_instantiated"; | 892 native "ClassMirror_supertype_instantiated"; |
| 862 | 893 |
| 863 static _nativeInterfaces(reflectedType) | 894 static _nativeInterfaces(reflectedType) |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 | 1047 |
| 1017 TypeMirror _upperBound = null; | 1048 TypeMirror _upperBound = null; |
| 1018 TypeMirror get upperBound { | 1049 TypeMirror get upperBound { |
| 1019 if (_upperBound == null) { | 1050 if (_upperBound == null) { |
| 1020 _upperBound = reflectType(_TypeVariableMirror_upper_bound(_reflectee)); | 1051 _upperBound = reflectType(_TypeVariableMirror_upper_bound(_reflectee)); |
| 1021 } | 1052 } |
| 1022 return _upperBound; | 1053 return _upperBound; |
| 1023 } | 1054 } |
| 1024 | 1055 |
| 1025 bool get hasReflectedType => false; | 1056 bool get hasReflectedType => false; |
| 1026 Type get reflectedType => throw new UnsupportedError() ; | 1057 Type get reflectedType => throw new UnsupportedError(); |
| 1058 Type get _reflectedType => _reflectee; |
| 1027 | 1059 |
| 1028 List<TypeVariableMirror> get typeVariables => emptyList; | 1060 List<TypeVariableMirror> get typeVariables => emptyList; |
| 1029 List<TypeMirror> get typeArguments => emptyList; | 1061 List<TypeMirror> get typeArguments => emptyList; |
| 1030 | 1062 |
| 1031 bool get isOriginalDeclaration => true; | 1063 bool get isOriginalDeclaration => true; |
| 1032 TypeMirror get originalDeclaration => this; | 1064 TypeMirror get originalDeclaration => this; |
| 1033 | 1065 |
| 1034 String toString() => "TypeVariableMirror on '${_n(simpleName)}'"; | 1066 String toString() => "TypeVariableMirror on '${_n(simpleName)}'"; |
| 1035 | 1067 |
| 1036 operator ==(other) { | 1068 operator ==(other) { |
| 1037 return other is TypeVariableMirror | 1069 return other is TypeVariableMirror |
| 1038 && simpleName == other.simpleName | 1070 && simpleName == other.simpleName |
| 1039 && owner == other.owner; | 1071 && owner == other.owner; |
| 1040 } | 1072 } |
| 1041 int get hashCode => simpleName.hashCode; | 1073 int get hashCode => simpleName.hashCode; |
| 1042 | 1074 |
| 1075 bool isSubtypeOf(TypeMirror other) { |
| 1076 if (other == currentMirrorSystem().dynamicType) return true; |
| 1077 if (other == currentMirrorSystem().voidType) return false; |
| 1078 return _subtypeTest(_reflectedType, other._reflectedType); |
| 1079 } |
| 1080 |
| 1081 bool isAssignableTo(TypeMirror other) { |
| 1082 if (other == currentMirrorSystem().dynamicType) return true; |
| 1083 if (other == currentMirrorSystem().voidType) return false; |
| 1084 return _moreSpecificTest(_reflectedType, other._reflectedType) |
| 1085 || _moreSpecificTest(other._reflectedType, _reflectedType); |
| 1086 } |
| 1087 |
| 1043 static DeclarationMirror _TypeVariableMirror_owner(reflectee) | 1088 static DeclarationMirror _TypeVariableMirror_owner(reflectee) |
| 1044 native "TypeVariableMirror_owner"; | 1089 native "TypeVariableMirror_owner"; |
| 1045 | 1090 |
| 1046 static Type _TypeVariableMirror_upper_bound(reflectee) | 1091 static Type _TypeVariableMirror_upper_bound(reflectee) |
| 1047 native "TypeVariableMirror_upper_bound"; | 1092 native "TypeVariableMirror_upper_bound"; |
| 1048 } | 1093 } |
| 1049 | 1094 |
| 1050 | 1095 |
| 1051 class _LocalTypedefMirror extends _LocalDeclarationMirror | 1096 class _LocalTypedefMirror extends _LocalDeclarationMirror |
| 1052 implements TypedefMirror { | 1097 implements TypedefMirror { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1120 } else { | 1165 } else { |
| 1121 _typeArguments = new UnmodifiableListView( | 1166 _typeArguments = new UnmodifiableListView( |
| 1122 _LocalClassMirror._computeTypeArguments(_reflectedType)); | 1167 _LocalClassMirror._computeTypeArguments(_reflectedType)); |
| 1123 } | 1168 } |
| 1124 } | 1169 } |
| 1125 return _typeArguments; | 1170 return _typeArguments; |
| 1126 } | 1171 } |
| 1127 | 1172 |
| 1128 String toString() => "TypedefMirror on '${_n(simpleName)}'"; | 1173 String toString() => "TypedefMirror on '${_n(simpleName)}'"; |
| 1129 | 1174 |
| 1175 bool isSubtypeOf(TypeMirror other) { |
| 1176 if (other == currentMirrorSystem().dynamicType) return true; |
| 1177 if (other == currentMirrorSystem().voidType) return false; |
| 1178 return _subtypeTest(_reflectedType, other._reflectedType); |
| 1179 } |
| 1180 |
| 1181 bool isAssignableTo(TypeMirror other) { |
| 1182 if (other == currentMirrorSystem().dynamicType) return true; |
| 1183 if (other == currentMirrorSystem().voidType) return false; |
| 1184 return _moreSpecificTest(_reflectedType, other._reflectedType) |
| 1185 || _moreSpecificTest(other._reflectedType, _reflectedType); |
| 1186 } |
| 1187 |
| 1130 static _nativeReferent(reflectedType) | 1188 static _nativeReferent(reflectedType) |
| 1131 native "TypedefMirror_referent"; | 1189 native "TypedefMirror_referent"; |
| 1132 | 1190 |
| 1133 static _nativeDeclaration(reflectedType) | 1191 static _nativeDeclaration(reflectedType) |
| 1134 native "TypedefMirror_declaration"; | 1192 native "TypedefMirror_declaration"; |
| 1135 } | 1193 } |
| 1136 | 1194 |
| 1137 Symbol _asSetter(Symbol getter, LibraryMirror library) { | 1195 Symbol _asSetter(Symbol getter, LibraryMirror library) { |
| 1138 var unwrapped = MirrorSystem.getName(getter); | 1196 var unwrapped = MirrorSystem.getName(getter); |
| 1139 return MirrorSystem.getSymbol('${unwrapped}=', library); | 1197 return MirrorSystem.getSymbol('${unwrapped}=', library); |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1524 bool operator ==(other) { | 1582 bool operator ==(other) { |
| 1525 if (other is! _SpecialTypeMirror) { | 1583 if (other is! _SpecialTypeMirror) { |
| 1526 return false; | 1584 return false; |
| 1527 } | 1585 } |
| 1528 return this.simpleName == other.simpleName; | 1586 return this.simpleName == other.simpleName; |
| 1529 } | 1587 } |
| 1530 | 1588 |
| 1531 int get hashCode => simpleName.hashCode; | 1589 int get hashCode => simpleName.hashCode; |
| 1532 | 1590 |
| 1533 String toString() => "TypeMirror on '${_n(simpleName)}'"; | 1591 String toString() => "TypeMirror on '${_n(simpleName)}'"; |
| 1592 |
| 1593 bool isSubtypeOf(TypeMirror other) { |
| 1594 return simpleName == #dynamic || other is _SpecialTypeMirror; |
| 1595 } |
| 1596 |
| 1597 bool isAssignableTo(TypeMirror other) { |
| 1598 return simpleName == #dynamic || other is _SpecialTypeMirror; |
| 1599 } |
| 1534 } | 1600 } |
| 1535 | 1601 |
| 1536 class _Mirrors { | 1602 class _Mirrors { |
| 1537 static MirrorSystem _currentMirrorSystem = null; | 1603 static MirrorSystem _currentMirrorSystem = null; |
| 1538 | 1604 |
| 1539 // Creates a new local MirrorSystem. | 1605 // Creates a new local MirrorSystem. |
| 1540 static MirrorSystem makeLocalMirrorSystem() | 1606 static MirrorSystem makeLocalMirrorSystem() |
| 1541 native 'Mirrors_makeLocalMirrorSystem'; | 1607 native 'Mirrors_makeLocalMirrorSystem'; |
| 1542 | 1608 |
| 1543 // The MirrorSystem for the current isolate. | 1609 // The MirrorSystem for the current isolate. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1580 if (typeMirror == null) { | 1646 if (typeMirror == null) { |
| 1581 typeMirror = makeLocalTypeMirror(key); | 1647 typeMirror = makeLocalTypeMirror(key); |
| 1582 _instanitationCache[key] = typeMirror; | 1648 _instanitationCache[key] = typeMirror; |
| 1583 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { | 1649 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { |
| 1584 _declarationCache[key] = typeMirror; | 1650 _declarationCache[key] = typeMirror; |
| 1585 } | 1651 } |
| 1586 } | 1652 } |
| 1587 return typeMirror; | 1653 return typeMirror; |
| 1588 } | 1654 } |
| 1589 } | 1655 } |
| OLD | NEW |