OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 // TODO(sigmund): rename and move to common/elements.dart | 5 // TODO(sigmund): rename and move to common/elements.dart |
6 library dart2js.type_system; | 6 library dart2js.type_system; |
7 | 7 |
8 import 'elements/resolution_types.dart'; | 8 import 'elements/types.dart'; |
9 import 'elements/elements.dart' | 9 import 'elements/entities.dart'; |
10 show | 10 import 'elements/elements.dart' show Entity; |
11 ClassElement, | |
12 ConstructorElement, | |
13 FunctionElement, | |
14 LibraryElement, | |
15 Element; | |
16 | 11 |
17 /// The common elements and types in Dart. | 12 /// The common elements and types in Dart. |
18 abstract class CommonElements { | 13 abstract class CommonElements { |
19 /// The `Object` class defined in 'dart:core'. | 14 /// The `Object` class defined in 'dart:core'. |
20 ClassElement get objectClass; | 15 ClassEntity get objectClass; |
21 | 16 |
22 /// The `bool` class defined in 'dart:core'. | 17 /// The `bool` class defined in 'dart:core'. |
23 ClassElement get boolClass; | 18 ClassEntity get boolClass; |
24 | 19 |
25 /// The `num` class defined in 'dart:core'. | 20 /// The `num` class defined in 'dart:core'. |
26 ClassElement get numClass; | 21 ClassEntity get numClass; |
27 | 22 |
28 /// The `int` class defined in 'dart:core'. | 23 /// The `int` class defined in 'dart:core'. |
29 ClassElement get intClass; | 24 ClassEntity get intClass; |
30 | 25 |
31 /// The `double` class defined in 'dart:core'. | 26 /// The `double` class defined in 'dart:core'. |
32 ClassElement get doubleClass; | 27 ClassEntity get doubleClass; |
33 | 28 |
34 /// The `Resource` class defined in 'dart:core'. | 29 /// The `Resource` class defined in 'dart:core'. |
35 ClassElement get resourceClass; | 30 ClassEntity get resourceClass; |
36 | 31 |
37 /// The `String` class defined in 'dart:core'. | 32 /// The `String` class defined in 'dart:core'. |
38 ClassElement get stringClass; | 33 ClassEntity get stringClass; |
39 | 34 |
40 /// The `Symbol` class defined in 'dart:core'. | 35 /// The `Symbol` class defined in 'dart:core'. |
41 ClassElement get symbolClass; | 36 ClassEntity get symbolClass; |
42 | 37 |
43 /// The `Function` class defined in 'dart:core'. | 38 /// The `Function` class defined in 'dart:core'. |
44 ClassElement get functionClass; | 39 ClassEntity get functionClass; |
45 | 40 |
46 /// The `Null` class defined in 'dart:core'. | 41 /// The `Null` class defined in 'dart:core'. |
47 ClassElement get nullClass; | 42 ClassEntity get nullClass; |
48 | 43 |
49 /// The `Type` class defined in 'dart:core'. | 44 /// The `Type` class defined in 'dart:core'. |
50 ClassElement get typeClass; | 45 ClassEntity get typeClass; |
51 | 46 |
52 /// The `StackTrace` class defined in 'dart:core'; | 47 /// The `StackTrace` class defined in 'dart:core'; |
53 ClassElement get stackTraceClass; | 48 ClassEntity get stackTraceClass; |
54 | 49 |
55 /// The `List` class defined in 'dart:core'; | 50 /// The `List` class defined in 'dart:core'; |
56 ClassElement get listClass; | 51 ClassEntity get listClass; |
57 | 52 |
58 /// The `Map` class defined in 'dart:core'; | 53 /// The `Map` class defined in 'dart:core'; |
59 ClassElement get mapClass; | 54 ClassEntity get mapClass; |
60 | 55 |
61 /// The `Iterable` class defined in 'dart:core'; | 56 /// The `Iterable` class defined in 'dart:core'; |
62 ClassElement get iterableClass; | 57 ClassEntity get iterableClass; |
63 | 58 |
64 /// The `Future` class defined in 'async';. | 59 /// The `Future` class defined in 'async';. |
65 ClassElement get futureClass; | 60 ClassEntity get futureClass; |
66 | 61 |
67 /// The `Stream` class defined in 'async'; | 62 /// The `Stream` class defined in 'async'; |
68 ClassElement get streamClass; | 63 ClassEntity get streamClass; |
69 | 64 |
70 /// The dart:core library. | 65 /// The dart:core library. |
71 LibraryElement get coreLibrary; | 66 LibraryEntity get coreLibrary; |
72 | 67 |
73 /// The dart:async library. | 68 /// The dart:async library. |
74 LibraryElement get asyncLibrary; | 69 LibraryEntity get asyncLibrary; |
75 | 70 |
76 /// The dart:mirrors library. Null if the program doesn't access dart:mirrors. | 71 /// The dart:mirrors library. Null if the program doesn't access dart:mirrors. |
77 LibraryElement get mirrorsLibrary; | 72 LibraryEntity get mirrorsLibrary; |
78 | 73 |
79 /// The dart:typed_data library. | 74 /// The dart:typed_data library. |
80 LibraryElement get typedDataLibrary; | 75 LibraryEntity get typedDataLibrary; |
81 | 76 |
82 /// The `NativeTypedData` class from dart:typed_data. | 77 /// The `NativeTypedData` class from dart:typed_data. |
83 ClassElement get typedDataClass; | 78 ClassEntity get typedDataClass; |
84 | 79 |
85 // TODO(johnniwinther): Move this to the JavaScriptBackend. | 80 // TODO(johnniwinther): Move this to the JavaScriptBackend. |
86 /// The class for patch annotation defined in dart:_js_helper. | 81 /// The class for patch annotation defined in dart:_js_helper. |
87 ClassElement get patchAnnotationClass; | 82 ClassEntity get patchAnnotationClass; |
88 | 83 |
89 // TODO(johnniwinther): Move this to the JavaScriptBackend. | 84 // TODO(johnniwinther): Move this to the JavaScriptBackend. |
90 ClassElement get nativeAnnotationClass; | 85 ClassEntity get nativeAnnotationClass; |
91 | 86 |
92 /// Constructor of the `Symbol` class. This getter will ensure that `Symbol` | 87 /// Constructor of the `Symbol` class. This getter will ensure that `Symbol` |
93 /// is resolved and lookup the constructor on demand. | 88 /// is resolved and lookup the constructor on demand. |
94 ConstructorElement get symbolConstructor; | 89 FunctionEntity get symbolConstructor; |
95 | 90 |
96 /// Whether [element] is the same as [symbolConstructor]. Used to check | 91 /// Whether [element] is the same as [symbolConstructor]. Used to check |
97 /// for the constructor without computing it until it is likely to be seen. | 92 /// for the constructor without computing it until it is likely to be seen. |
98 bool isSymbolConstructor(Element e); | 93 bool isSymbolConstructor(Entity e); |
99 | 94 |
100 /// The `MirrorSystem` class in dart:mirrors. | 95 /// The `MirrorSystem` class in dart:mirrors. |
101 ClassElement get mirrorSystemClass; | 96 ClassEntity get mirrorSystemClass; |
102 | 97 |
103 /// Whether [element] is `MirrorClass.getName`. Used to check for the use of | 98 /// Whether [element] is `MirrorClass.getName`. Used to check for the use of |
104 /// that static method without forcing the resolution of the `MirrorSystem` | 99 /// that static method without forcing the resolution of the `MirrorSystem` |
105 /// class until it is necessary. | 100 /// class until it is necessary. |
106 bool isMirrorSystemGetNameFunction(Element element); | 101 bool isMirrorSystemGetNameFunction(MemberEntity element); |
107 | 102 |
108 /// The `MirrorsUsed` annotation in dart:mirrors. | 103 /// The `MirrorsUsed` annotation in dart:mirrors. |
109 ClassElement get mirrorsUsedClass; | 104 ClassEntity get mirrorsUsedClass; |
110 | 105 |
111 /// Whether [element] is the constructor of the `MirrorsUsed` class. Used to | 106 /// Whether [element] is the constructor of the `MirrorsUsed` class. Used to |
112 /// check for the constructor without forcing the resolution of the | 107 /// check for the constructor without forcing the resolution of the |
113 /// `MirrorsUsed` class until it is necessary. | 108 /// `MirrorsUsed` class until it is necessary. |
114 bool isMirrorsUsedConstructor(ConstructorElement element); | 109 bool isMirrorsUsedConstructor(FunctionEntity element); |
115 | 110 |
116 /// The `DeferredLibrary` annotation in dart:async that was used before the | 111 /// The `DeferredLibrary` annotation in dart:async that was used before the |
117 /// deferred import syntax was introduced. | 112 /// deferred import syntax was introduced. |
118 // TODO(sigmund): drop support for this old syntax? | 113 // TODO(sigmund): drop support for this old syntax? |
119 ClassElement get deferredLibraryClass; | 114 ClassEntity get deferredLibraryClass; |
120 | 115 |
121 /// The function `identical` in dart:core. | 116 /// The function `identical` in dart:core. |
122 FunctionElement get identicalFunction; | 117 FunctionEntity get identicalFunction; |
123 | 118 |
124 /// The method `Function.apply`. | 119 /// The method `Function.apply`. |
125 FunctionElement get functionApplyMethod; | 120 FunctionEntity get functionApplyMethod; |
126 | 121 |
127 /// Whether [element] is the same as [functionApplyMethod]. This will not | 122 /// Whether [element] is the same as [functionApplyMethod]. This will not |
128 /// resolve the apply method if it hasn't been seen yet during compilation. | 123 /// resolve the apply method if it hasn't been seen yet during compilation. |
129 bool isFunctionApplyMethod(Element element); | 124 bool isFunctionApplyMethod(MemberEntity element); |
130 | 125 |
131 /// The unnamed constructor of `List`. | 126 /// The unnamed constructor of `List`. |
132 ConstructorElement get unnamedListConstructor; | 127 FunctionEntity get unnamedListConstructor; |
133 | 128 |
134 /// The 'filled' constructor of `List`. | 129 /// The 'filled' constructor of `List`. |
135 ConstructorElement get filledListConstructor; | 130 FunctionEntity get filledListConstructor; |
136 | 131 |
137 /// The `dynamic` type. | 132 /// The `dynamic` type. |
138 ResolutionDynamicType get dynamicType; | 133 DynamicType get dynamicType; |
139 | 134 |
140 /// The `Object` type defined in 'dart:core'. | 135 /// The `Object` type defined in 'dart:core'. |
141 ResolutionInterfaceType get objectType; | 136 InterfaceType get objectType; |
142 | 137 |
143 /// The `bool` type defined in 'dart:core'. | 138 /// The `bool` type defined in 'dart:core'. |
144 ResolutionInterfaceType get boolType; | 139 InterfaceType get boolType; |
145 | 140 |
146 /// The `num` type defined in 'dart:core'. | 141 /// The `num` type defined in 'dart:core'. |
147 ResolutionInterfaceType get numType; | 142 InterfaceType get numType; |
148 | 143 |
149 /// The `int` type defined in 'dart:core'. | 144 /// The `int` type defined in 'dart:core'. |
150 ResolutionInterfaceType get intType; | 145 InterfaceType get intType; |
151 | 146 |
152 /// The `double` type defined in 'dart:core'. | 147 /// The `double` type defined in 'dart:core'. |
153 ResolutionInterfaceType get doubleType; | 148 InterfaceType get doubleType; |
154 | 149 |
155 /// The `Resource` type defined in 'dart:core'. | 150 /// The `Resource` type defined in 'dart:core'. |
156 ResolutionInterfaceType get resourceType; | 151 InterfaceType get resourceType; |
157 | 152 |
158 /// The `String` type defined in 'dart:core'. | 153 /// The `String` type defined in 'dart:core'. |
159 ResolutionInterfaceType get stringType; | 154 InterfaceType get stringType; |
160 | 155 |
161 /// The `Symbol` type defined in 'dart:core'. | 156 /// The `Symbol` type defined in 'dart:core'. |
162 ResolutionInterfaceType get symbolType; | 157 InterfaceType get symbolType; |
163 | 158 |
164 /// The `Function` type defined in 'dart:core'. | 159 /// The `Function` type defined in 'dart:core'. |
165 ResolutionInterfaceType get functionType; | 160 InterfaceType get functionType; |
166 | 161 |
167 /// The `Null` type defined in 'dart:core'. | 162 /// The `Null` type defined in 'dart:core'. |
168 ResolutionInterfaceType get nullType; | 163 InterfaceType get nullType; |
169 | 164 |
170 /// The `Type` type defined in 'dart:core'. | 165 /// The `Type` type defined in 'dart:core'. |
171 ResolutionInterfaceType get typeType; | 166 InterfaceType get typeType; |
172 | 167 |
173 /// The `StackTrace` type defined in 'dart:core'; | 168 /// The `StackTrace` type defined in 'dart:core'; |
174 ResolutionInterfaceType get stackTraceType; | 169 InterfaceType get stackTraceType; |
175 | 170 |
176 /// Returns an instance of the `List` type defined in 'dart:core' with | 171 /// Returns an instance of the `List` type defined in 'dart:core' with |
177 /// [elementType] as its type argument. | 172 /// [elementType] as its type argument. |
178 /// | 173 /// |
179 /// If no type argument is provided, the canonical raw type is returned. | 174 /// If no type argument is provided, the canonical raw type is returned. |
180 ResolutionInterfaceType listType([ResolutionDartType elementType]); | 175 InterfaceType listType([DartType elementType]); |
181 | 176 |
182 /// Returns an instance of the `Map` type defined in 'dart:core' with | 177 /// Returns an instance of the `Map` type defined in 'dart:core' with |
183 /// [keyType] and [valueType] as its type arguments. | 178 /// [keyType] and [valueType] as its type arguments. |
184 /// | 179 /// |
185 /// If no type arguments are provided, the canonical raw type is returned. | 180 /// If no type arguments are provided, the canonical raw type is returned. |
186 ResolutionInterfaceType mapType( | 181 InterfaceType mapType([DartType keyType, DartType valueType]); |
187 [ResolutionDartType keyType, ResolutionDartType valueType]); | |
188 | 182 |
189 /// Returns an instance of the `Iterable` type defined in 'dart:core' with | 183 /// Returns an instance of the `Iterable` type defined in 'dart:core' with |
190 /// [elementType] as its type argument. | 184 /// [elementType] as its type argument. |
191 /// | 185 /// |
192 /// If no type argument is provided, the canonical raw type is returned. | 186 /// If no type argument is provided, the canonical raw type is returned. |
193 ResolutionInterfaceType iterableType([ResolutionDartType elementType]); | 187 InterfaceType iterableType([DartType elementType]); |
194 | 188 |
195 /// Returns an instance of the `Future` type defined in 'dart:async' with | 189 /// Returns an instance of the `Future` type defined in 'dart:async' with |
196 /// [elementType] as its type argument. | 190 /// [elementType] as its type argument. |
197 /// | 191 /// |
198 /// If no type argument is provided, the canonical raw type is returned. | 192 /// If no type argument is provided, the canonical raw type is returned. |
199 ResolutionInterfaceType futureType([ResolutionDartType elementType]); | 193 InterfaceType futureType([DartType elementType]); |
200 | 194 |
201 /// Returns an instance of the `Stream` type defined in 'dart:async' with | 195 /// Returns an instance of the `Stream` type defined in 'dart:async' with |
202 /// [elementType] as its type argument. | 196 /// [elementType] as its type argument. |
203 /// | 197 /// |
204 /// If no type argument is provided, the canonical raw type is returned. | 198 /// If no type argument is provided, the canonical raw type is returned. |
205 ResolutionInterfaceType streamType([ResolutionDartType elementType]); | 199 InterfaceType streamType([DartType elementType]); |
206 | 200 |
207 /// Returns `true` if [element] is a superclass of `String` or `num`. | 201 /// Returns `true` if [element] is a superclass of `String` or `num`. |
208 bool isNumberOrStringSupertype(ClassElement element); | 202 bool isNumberOrStringSupertype(ClassEntity element); |
209 | 203 |
210 /// Returns `true` if [element] is a superclass of `String`. | 204 /// Returns `true` if [element] is a superclass of `String`. |
211 bool isStringOnlySupertype(ClassElement element); | 205 bool isStringOnlySupertype(ClassEntity element); |
212 | 206 |
213 /// Returns `true` if [element] is a superclass of `List`. | 207 /// Returns `true` if [element] is a superclass of `List`. |
214 bool isListSupertype(ClassElement element); | 208 bool isListSupertype(ClassEntity element); |
215 } | 209 } |
OLD | NEW |