OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 library dart2js.kernel.element_map; | 5 library dart2js.kernel.element_map; |
6 | 6 |
7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
8 | 8 |
9 import '../common.dart'; | 9 import '../common.dart'; |
10 import '../common/names.dart' show Identifiers; | 10 import '../common/names.dart' show Identifiers; |
11 import '../common/resolution.dart'; | 11 import '../common/resolution.dart'; |
12 import '../compile_time_constants.dart'; | 12 import '../compile_time_constants.dart'; |
13 import '../constants/constant_system.dart'; | 13 import '../constants/constant_system.dart'; |
14 import '../constants/constructors.dart'; | 14 import '../constants/constructors.dart'; |
15 import '../constants/evaluation.dart'; | 15 import '../constants/evaluation.dart'; |
16 import '../constants/expressions.dart'; | 16 import '../constants/expressions.dart'; |
17 import '../constants/values.dart'; | 17 import '../constants/values.dart'; |
18 import '../common_elements.dart'; | 18 import '../common_elements.dart'; |
19 import '../elements/elements.dart'; | 19 import '../elements/elements.dart'; |
20 import '../elements/entities.dart'; | 20 import '../elements/entities.dart'; |
21 import '../elements/names.dart'; | 21 import '../elements/names.dart'; |
22 import '../elements/types.dart'; | 22 import '../elements/types.dart'; |
23 import '../environment.dart'; | 23 import '../environment.dart'; |
24 import '../frontend_strategy.dart'; | 24 import '../frontend_strategy.dart'; |
25 import '../js_backend/backend_usage.dart'; | 25 import '../js_backend/backend_usage.dart'; |
26 import '../js_backend/constant_system_javascript.dart'; | 26 import '../js_backend/constant_system_javascript.dart'; |
27 import '../js_backend/interceptor_data.dart'; | 27 import '../js_backend/interceptor_data.dart'; |
28 import '../js_backend/native_data.dart'; | 28 import '../js_backend/native_data.dart'; |
29 import '../js_backend/no_such_method_registry.dart'; | 29 import '../js_backend/no_such_method_registry.dart'; |
| 30 import '../js_backend/runtime_types.dart'; |
30 import '../js_model/elements.dart'; | 31 import '../js_model/elements.dart'; |
| 32 import '../native/enqueue.dart'; |
31 import '../native/native.dart' as native; | 33 import '../native/native.dart' as native; |
32 import '../native/resolver.dart'; | 34 import '../native/resolver.dart'; |
33 import '../ordered_typeset.dart'; | 35 import '../ordered_typeset.dart'; |
| 36 import '../options.dart'; |
34 import '../universe/class_set.dart'; | 37 import '../universe/class_set.dart'; |
35 import '../universe/selector.dart'; | 38 import '../universe/selector.dart'; |
36 import '../universe/world_builder.dart'; | 39 import '../universe/world_builder.dart'; |
37 import '../world.dart'; | 40 import '../world.dart'; |
38 import '../util/util.dart' show Link, LinkBuilder; | 41 import '../util/util.dart' show Link, LinkBuilder; |
39 import 'element_map.dart'; | 42 import 'element_map.dart'; |
40 import 'element_map_mixins.dart'; | 43 import 'element_map_mixins.dart'; |
41 import 'elements.dart'; | 44 import 'elements.dart'; |
42 import 'env.dart'; | 45 import 'env.dart'; |
43 import 'kelements.dart'; | 46 import 'kelements.dart'; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 List<MemberData> _memberData = <MemberData>[]; | 96 List<MemberData> _memberData = <MemberData>[]; |
94 | 97 |
95 KernelToElementMapBase(this.reporter, Environment environment) { | 98 KernelToElementMapBase(this.reporter, Environment environment) { |
96 _elementEnvironment = new KernelElementEnvironment(this); | 99 _elementEnvironment = new KernelElementEnvironment(this); |
97 _commonElements = new CommonElements(_elementEnvironment); | 100 _commonElements = new CommonElements(_elementEnvironment); |
98 _constantEnvironment = new KernelConstantEnvironment(this, environment); | 101 _constantEnvironment = new KernelConstantEnvironment(this, environment); |
99 _typeConverter = new DartTypeConverter(this); | 102 _typeConverter = new DartTypeConverter(this); |
100 _types = new _KernelDartTypes(this); | 103 _types = new _KernelDartTypes(this); |
101 } | 104 } |
102 | 105 |
| 106 bool checkFamily(Entity entity); |
| 107 |
103 DartTypes get types => _types; | 108 DartTypes get types => _types; |
104 | 109 |
105 @override | 110 @override |
106 ElementEnvironment get elementEnvironment => _elementEnvironment; | 111 ElementEnvironment get elementEnvironment => _elementEnvironment; |
107 | 112 |
108 @override | 113 @override |
109 CommonElements get commonElements => _commonElements; | 114 CommonElements get commonElements => _commonElements; |
110 | 115 |
111 FunctionEntity get _mainFunction { | 116 FunctionEntity get _mainFunction { |
112 return _env.mainMethod != null ? _getMethod(_env.mainMethod) : null; | 117 return _env.mainMethod != null ? _getMethod(_env.mainMethod) : null; |
113 } | 118 } |
114 | 119 |
115 LibraryEntity get _mainLibrary { | 120 LibraryEntity get _mainLibrary { |
116 return _env.mainMethod != null | 121 return _env.mainMethod != null |
117 ? _getLibrary(_env.mainMethod.enclosingLibrary) | 122 ? _getLibrary(_env.mainMethod.enclosingLibrary) |
118 : null; | 123 : null; |
119 } | 124 } |
120 | 125 |
121 Iterable<LibraryEntity> get _libraries; | 126 Iterable<LibraryEntity> get _libraries; |
122 | 127 |
123 LibraryEntity lookupLibrary(Uri uri) { | 128 LibraryEntity lookupLibrary(Uri uri) { |
124 LibraryEnv libraryEnv = _env.lookupLibrary(uri); | 129 LibraryEnv libraryEnv = _env.lookupLibrary(uri); |
125 if (libraryEnv == null) return null; | 130 if (libraryEnv == null) return null; |
126 return _getLibrary(libraryEnv.library, libraryEnv); | 131 return _getLibrary(libraryEnv.library, libraryEnv); |
127 } | 132 } |
128 | 133 |
129 String _getLibraryName(IndexedLibrary library) { | 134 String _getLibraryName(IndexedLibrary library) { |
| 135 assert(checkFamily(library)); |
130 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 136 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
131 return libraryEnv.library.name ?? ''; | 137 return libraryEnv.library.name ?? ''; |
132 } | 138 } |
133 | 139 |
134 MemberEntity lookupLibraryMember(IndexedLibrary library, String name, | 140 MemberEntity lookupLibraryMember(IndexedLibrary library, String name, |
135 {bool setter: false}) { | 141 {bool setter: false}) { |
| 142 assert(checkFamily(library)); |
136 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 143 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
137 ir.Member member = libraryEnv.lookupMember(name, setter: setter); | 144 ir.Member member = libraryEnv.lookupMember(name, setter: setter); |
138 return member != null ? getMember(member) : null; | 145 return member != null ? getMember(member) : null; |
139 } | 146 } |
140 | 147 |
141 void _forEachLibraryMember( | 148 void _forEachLibraryMember( |
142 IndexedLibrary library, void f(MemberEntity member)) { | 149 IndexedLibrary library, void f(MemberEntity member)) { |
| 150 assert(checkFamily(library)); |
143 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 151 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
144 libraryEnv.forEachMember((ir.Member node) { | 152 libraryEnv.forEachMember((ir.Member node) { |
145 f(getMember(node)); | 153 f(getMember(node)); |
146 }); | 154 }); |
147 } | 155 } |
148 | 156 |
149 ClassEntity lookupClass(IndexedLibrary library, String name) { | 157 ClassEntity lookupClass(IndexedLibrary library, String name) { |
| 158 assert(checkFamily(library)); |
150 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 159 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
151 ClassEnv classEnv = libraryEnv.lookupClass(name); | 160 ClassEnv classEnv = libraryEnv.lookupClass(name); |
152 if (classEnv != null) { | 161 if (classEnv != null) { |
153 return _getClass(classEnv.cls, classEnv); | 162 return _getClass(classEnv.cls, classEnv); |
154 } | 163 } |
155 return null; | 164 return null; |
156 } | 165 } |
157 | 166 |
158 void _forEachClass(IndexedLibrary library, void f(ClassEntity cls)) { | 167 void _forEachClass(IndexedLibrary library, void f(ClassEntity cls)) { |
| 168 assert(checkFamily(library)); |
159 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 169 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
160 libraryEnv.forEachClass((ClassEnv classEnv) { | 170 libraryEnv.forEachClass((ClassEnv classEnv) { |
161 if (!classEnv.isUnnamedMixinApplication) { | 171 if (!classEnv.isUnnamedMixinApplication) { |
162 f(_getClass(classEnv.cls, classEnv)); | 172 f(_getClass(classEnv.cls, classEnv)); |
163 } | 173 } |
164 }); | 174 }); |
165 } | 175 } |
166 | 176 |
167 MemberEntity lookupClassMember(IndexedClass cls, String name, | 177 MemberEntity lookupClassMember(IndexedClass cls, String name, |
168 {bool setter: false}) { | 178 {bool setter: false}) { |
| 179 assert(checkFamily(cls)); |
169 ClassEnv classEnv = _classEnvs[cls.classIndex]; | 180 ClassEnv classEnv = _classEnvs[cls.classIndex]; |
170 ir.Member member = classEnv.lookupMember(name, setter: setter); | 181 ir.Member member = classEnv.lookupMember(name, setter: setter); |
171 return member != null ? getMember(member) : null; | 182 return member != null ? getMember(member) : null; |
172 } | 183 } |
173 | 184 |
174 ConstructorEntity lookupConstructor(IndexedClass cls, String name) { | 185 ConstructorEntity lookupConstructor(IndexedClass cls, String name) { |
| 186 assert(checkFamily(cls)); |
175 ClassEnv classEnv = _classEnvs[cls.classIndex]; | 187 ClassEnv classEnv = _classEnvs[cls.classIndex]; |
176 ir.Member member = classEnv.lookupConstructor(name); | 188 ir.Member member = classEnv.lookupConstructor(name); |
177 return member != null ? getConstructor(member) : null; | 189 return member != null ? getConstructor(member) : null; |
178 } | 190 } |
179 | 191 |
180 @override | 192 @override |
181 InterfaceType createInterfaceType( | 193 InterfaceType createInterfaceType( |
182 ir.Class cls, List<ir.DartType> typeArguments) { | 194 ir.Class cls, List<ir.DartType> typeArguments) { |
183 return new InterfaceType(getClass(cls), getDartTypes(typeArguments)); | 195 return new InterfaceType(getClass(cls), getDartTypes(typeArguments)); |
184 } | 196 } |
185 | 197 |
186 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); | 198 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); |
187 | 199 |
188 LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]); | 200 LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]); |
189 | 201 |
190 @override | 202 @override |
191 ClassEntity getClass(ir.Class node) => _getClass(node); | 203 ClassEntity getClass(ir.Class node) => _getClass(node); |
192 | 204 |
193 ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]); | 205 ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]); |
194 | 206 |
195 InterfaceType _getSuperType(IndexedClass cls) { | 207 InterfaceType _getSuperType(IndexedClass cls) { |
| 208 assert(checkFamily(cls)); |
196 ClassData data = _classData[cls.classIndex]; | 209 ClassData data = _classData[cls.classIndex]; |
197 _ensureSupertypes(cls, data); | 210 _ensureSupertypes(cls, data); |
198 return data.supertype; | 211 return data.supertype; |
199 } | 212 } |
200 | 213 |
201 void _ensureThisAndRawType(ClassEntity cls, ClassData data) { | 214 void _ensureThisAndRawType(ClassEntity cls, ClassData data) { |
| 215 assert(checkFamily(cls)); |
202 if (data.thisType == null) { | 216 if (data.thisType == null) { |
203 ir.Class node = data.cls; | 217 ir.Class node = data.cls; |
204 // TODO(johnniwinther): Add the type argument to the list literal when we | 218 // TODO(johnniwinther): Add the type argument to the list literal when we |
205 // no longer use resolution types. | 219 // no longer use resolution types. |
206 if (node.typeParameters.isEmpty) { | 220 if (node.typeParameters.isEmpty) { |
207 data.thisType = | 221 data.thisType = |
208 data.rawType = new InterfaceType(cls, const/*<DartType>*/ []); | 222 data.rawType = new InterfaceType(cls, const/*<DartType>*/ []); |
209 } else { | 223 } else { |
210 data.thisType = new InterfaceType( | 224 data.thisType = new InterfaceType( |
211 cls, | 225 cls, |
212 new List/*<DartType>*/ .generate(node.typeParameters.length, | 226 new List/*<DartType>*/ .generate(node.typeParameters.length, |
213 (int index) { | 227 (int index) { |
214 return new TypeVariableType( | 228 return new TypeVariableType( |
215 _getTypeVariable(node.typeParameters[index])); | 229 _getTypeVariable(node.typeParameters[index])); |
216 })); | 230 })); |
217 data.rawType = new InterfaceType( | 231 data.rawType = new InterfaceType( |
218 cls, | 232 cls, |
219 new List/*<DartType>*/ .filled( | 233 new List/*<DartType>*/ .filled( |
220 node.typeParameters.length, const DynamicType())); | 234 node.typeParameters.length, const DynamicType())); |
221 } | 235 } |
222 } | 236 } |
223 } | 237 } |
224 | 238 |
225 TypeVariableEntity getTypeVariable(ir.TypeParameter node) => | 239 TypeVariableEntity getTypeVariable(ir.TypeParameter node) => |
226 _getTypeVariable(node); | 240 _getTypeVariable(node); |
227 | 241 |
228 TypeVariableEntity _getTypeVariable(ir.TypeParameter node); | 242 TypeVariableEntity _getTypeVariable(ir.TypeParameter node); |
229 | 243 |
230 void _ensureSupertypes(ClassEntity cls, ClassData data) { | 244 void _ensureSupertypes(ClassEntity cls, ClassData data) { |
| 245 assert(checkFamily(cls)); |
231 if (data.orderedTypeSet == null) { | 246 if (data.orderedTypeSet == null) { |
232 _ensureThisAndRawType(cls, data); | 247 _ensureThisAndRawType(cls, data); |
233 | 248 |
234 ir.Class node = data.cls; | 249 ir.Class node = data.cls; |
235 | 250 |
236 if (node.supertype == null) { | 251 if (node.supertype == null) { |
237 data.orderedTypeSet = new OrderedTypeSet.singleton(data.thisType); | 252 data.orderedTypeSet = new OrderedTypeSet.singleton(data.thisType); |
238 data.isMixinApplication = false; | 253 data.isMixinApplication = false; |
239 data.interfaces = const <InterfaceType>[]; | 254 data.interfaces = const <InterfaceType>[]; |
240 } else { | 255 } else { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 {bool requireConstant: true}) { | 404 {bool requireConstant: true}) { |
390 return _constantEnvironment.getConstantValue(constant); | 405 return _constantEnvironment.getConstantValue(constant); |
391 } | 406 } |
392 | 407 |
393 DartType _substByContext(DartType type, InterfaceType context) { | 408 DartType _substByContext(DartType type, InterfaceType context) { |
394 return type.subst( | 409 return type.subst( |
395 context.typeArguments, _getThisType(context.element).typeArguments); | 410 context.typeArguments, _getThisType(context.element).typeArguments); |
396 } | 411 } |
397 | 412 |
398 InterfaceType _getThisType(IndexedClass cls) { | 413 InterfaceType _getThisType(IndexedClass cls) { |
| 414 assert(checkFamily(cls)); |
399 ClassData data = _classData[cls.classIndex]; | 415 ClassData data = _classData[cls.classIndex]; |
400 _ensureThisAndRawType(cls, data); | 416 _ensureThisAndRawType(cls, data); |
401 return data.thisType; | 417 return data.thisType; |
402 } | 418 } |
403 | 419 |
404 InterfaceType _getRawType(IndexedClass cls) { | 420 InterfaceType _getRawType(IndexedClass cls) { |
| 421 assert(checkFamily(cls)); |
405 ClassData data = _classData[cls.classIndex]; | 422 ClassData data = _classData[cls.classIndex]; |
406 _ensureThisAndRawType(cls, data); | 423 _ensureThisAndRawType(cls, data); |
407 return data.rawType; | 424 return data.rawType; |
408 } | 425 } |
409 | 426 |
410 FunctionType _getFunctionType(IndexedFunction function) { | 427 FunctionType _getFunctionType(IndexedFunction function) { |
| 428 assert(checkFamily(function)); |
411 FunctionData data = _memberData[function.memberIndex]; | 429 FunctionData data = _memberData[function.memberIndex]; |
412 return data.getFunctionType(this); | 430 return data.getFunctionType(this); |
413 } | 431 } |
414 | 432 |
415 ClassEntity _getAppliedMixin(IndexedClass cls) { | 433 ClassEntity _getAppliedMixin(IndexedClass cls) { |
| 434 assert(checkFamily(cls)); |
416 ClassData data = _classData[cls.classIndex]; | 435 ClassData data = _classData[cls.classIndex]; |
417 _ensureSupertypes(cls, data); | 436 _ensureSupertypes(cls, data); |
418 return data.mixedInType?.element; | 437 return data.mixedInType?.element; |
419 } | 438 } |
420 | 439 |
421 bool _isMixinApplication(IndexedClass cls) { | 440 bool _isMixinApplication(IndexedClass cls) { |
| 441 assert(checkFamily(cls)); |
422 ClassData data = _classData[cls.classIndex]; | 442 ClassData data = _classData[cls.classIndex]; |
423 _ensureSupertypes(cls, data); | 443 _ensureSupertypes(cls, data); |
424 return data.isMixinApplication; | 444 return data.isMixinApplication; |
425 } | 445 } |
426 | 446 |
427 bool _isUnnamedMixinApplication(IndexedClass cls) { | 447 bool _isUnnamedMixinApplication(IndexedClass cls) { |
| 448 assert(checkFamily(cls)); |
428 ClassEnv env = _classEnvs[cls.classIndex]; | 449 ClassEnv env = _classEnvs[cls.classIndex]; |
429 return env.isUnnamedMixinApplication; | 450 return env.isUnnamedMixinApplication; |
430 } | 451 } |
431 | 452 |
432 void _forEachSupertype(IndexedClass cls, void f(InterfaceType supertype)) { | 453 void _forEachSupertype(IndexedClass cls, void f(InterfaceType supertype)) { |
| 454 assert(checkFamily(cls)); |
433 ClassData data = _classData[cls.classIndex]; | 455 ClassData data = _classData[cls.classIndex]; |
434 _ensureSupertypes(cls, data); | 456 _ensureSupertypes(cls, data); |
435 data.orderedTypeSet.supertypes.forEach(f); | 457 data.orderedTypeSet.supertypes.forEach(f); |
436 } | 458 } |
437 | 459 |
438 void _forEachMixin(IndexedClass cls, void f(ClassEntity mixin)) { | 460 void _forEachMixin(IndexedClass cls, void f(ClassEntity mixin)) { |
| 461 assert(checkFamily(cls)); |
439 while (cls != null) { | 462 while (cls != null) { |
440 ClassData data = _classData[cls.classIndex]; | 463 ClassData data = _classData[cls.classIndex]; |
441 _ensureSupertypes(cls, data); | 464 _ensureSupertypes(cls, data); |
442 if (data.mixedInType != null) { | 465 if (data.mixedInType != null) { |
443 f(data.mixedInType.element); | 466 f(data.mixedInType.element); |
444 } | 467 } |
445 cls = data.supertype?.element; | 468 cls = data.supertype?.element; |
446 } | 469 } |
447 } | 470 } |
448 | 471 |
449 void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) { | 472 void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) { |
| 473 assert(checkFamily(cls)); |
450 ClassEnv env = _classEnvs[cls.classIndex]; | 474 ClassEnv env = _classEnvs[cls.classIndex]; |
451 env.forEachConstructor((ir.Member member) { | 475 env.forEachConstructor((ir.Member member) { |
452 f(getConstructor(member)); | 476 f(getConstructor(member)); |
453 }); | 477 }); |
454 } | 478 } |
455 | 479 |
456 void _forEachClassMember( | 480 void _forEachClassMember( |
457 IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) { | 481 IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) { |
| 482 assert(checkFamily(cls)); |
458 ClassEnv env = _classEnvs[cls.classIndex]; | 483 ClassEnv env = _classEnvs[cls.classIndex]; |
459 env.forEachMember((ir.Member member) { | 484 env.forEachMember((ir.Member member) { |
460 f(cls, getMember(member)); | 485 f(cls, getMember(member)); |
461 }); | 486 }); |
462 ClassData data = _classData[cls.classIndex]; | 487 ClassData data = _classData[cls.classIndex]; |
463 _ensureSupertypes(cls, data); | 488 _ensureSupertypes(cls, data); |
464 if (data.supertype != null) { | 489 if (data.supertype != null) { |
465 _forEachClassMember(data.supertype.element, f); | 490 _forEachClassMember(data.supertype.element, f); |
466 } | 491 } |
467 } | 492 } |
468 | 493 |
469 ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) { | 494 ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) { |
| 495 assert(checkFamily(constructor)); |
470 ConstructorData data = _memberData[constructor.memberIndex]; | 496 ConstructorData data = _memberData[constructor.memberIndex]; |
471 return data.getConstructorConstant(this, constructor); | 497 return data.getConstructorConstant(this, constructor); |
472 } | 498 } |
473 | 499 |
474 ConstantExpression _getFieldConstant(IndexedField field) { | 500 ConstantExpression _getFieldConstant(IndexedField field) { |
| 501 assert(checkFamily(field)); |
475 FieldData data = _memberData[field.memberIndex]; | 502 FieldData data = _memberData[field.memberIndex]; |
476 return data.getFieldConstant(this, field); | 503 return data.getFieldConstant(this, field); |
477 } | 504 } |
478 | 505 |
479 InterfaceType _asInstanceOf(InterfaceType type, ClassEntity cls) { | 506 InterfaceType _asInstanceOf(InterfaceType type, ClassEntity cls) { |
| 507 assert(checkFamily(cls)); |
480 OrderedTypeSet orderedTypeSet = _getOrderedTypeSet(type.element); | 508 OrderedTypeSet orderedTypeSet = _getOrderedTypeSet(type.element); |
481 InterfaceType supertype = | 509 InterfaceType supertype = |
482 orderedTypeSet.asInstanceOf(cls, _getHierarchyDepth(cls)); | 510 orderedTypeSet.asInstanceOf(cls, _getHierarchyDepth(cls)); |
483 if (supertype != null) { | 511 if (supertype != null) { |
484 supertype = _substByContext(supertype, type); | 512 supertype = _substByContext(supertype, type); |
485 } | 513 } |
486 return supertype; | 514 return supertype; |
487 } | 515 } |
488 | 516 |
489 OrderedTypeSet _getOrderedTypeSet(IndexedClass cls) { | 517 OrderedTypeSet _getOrderedTypeSet(IndexedClass cls) { |
| 518 assert(checkFamily(cls)); |
490 ClassData data = _classData[cls.classIndex]; | 519 ClassData data = _classData[cls.classIndex]; |
491 _ensureSupertypes(cls, data); | 520 _ensureSupertypes(cls, data); |
492 return data.orderedTypeSet; | 521 return data.orderedTypeSet; |
493 } | 522 } |
494 | 523 |
495 int _getHierarchyDepth(IndexedClass cls) { | 524 int _getHierarchyDepth(IndexedClass cls) { |
| 525 assert(checkFamily(cls)); |
496 ClassData data = _classData[cls.classIndex]; | 526 ClassData data = _classData[cls.classIndex]; |
497 _ensureSupertypes(cls, data); | 527 _ensureSupertypes(cls, data); |
498 return data.orderedTypeSet.maxDepth; | 528 return data.orderedTypeSet.maxDepth; |
499 } | 529 } |
500 | 530 |
501 Iterable<InterfaceType> _getInterfaces(IndexedClass cls) { | 531 Iterable<InterfaceType> _getInterfaces(IndexedClass cls) { |
| 532 assert(checkFamily(cls)); |
502 ClassData data = _classData[cls.classIndex]; | 533 ClassData data = _classData[cls.classIndex]; |
503 _ensureSupertypes(cls, data); | 534 _ensureSupertypes(cls, data); |
504 return data.interfaces; | 535 return data.interfaces; |
505 } | 536 } |
506 | 537 |
507 Spannable _getSpannable(MemberEntity member, ir.Node node) { | 538 Spannable _getSpannable(MemberEntity member, ir.Node node) { |
508 return member; | 539 return member; |
509 } | 540 } |
510 | 541 |
511 ir.Member _getMemberNode(covariant IndexedMember member) { | 542 ir.Member _getMemberNode(covariant IndexedMember member) { |
| 543 assert(checkFamily(member)); |
512 return _memberData[member.memberIndex].node; | 544 return _memberData[member.memberIndex].node; |
513 } | 545 } |
514 | 546 |
515 ir.Class _getClassNode(covariant IndexedClass cls) { | 547 ir.Class _getClassNode(covariant IndexedClass cls) { |
| 548 assert(checkFamily(cls)); |
516 return _classEnvs[cls.classIndex].cls; | 549 return _classEnvs[cls.classIndex].cls; |
517 } | 550 } |
518 } | 551 } |
519 | 552 |
520 /// Mixin that implements the abstract methods in [KernelToElementMapBase] by | 553 /// Mixin that implements the abstract methods in [KernelToElementMapBase] by |
521 /// creating K-model elements. | 554 /// creating K-model elements. |
522 abstract class ElementCreatorMixin { | 555 abstract class ElementCreatorMixin { |
523 ProgramEnv get _env; | 556 ProgramEnv get _env; |
524 List<LibraryEntity> get _libraryList; | 557 List<LibraryEntity> get _libraryList; |
525 List<LibraryEnv> get _libraryEnvs; | 558 List<LibraryEnv> get _libraryEnvs; |
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
973 // [JsStrategy] is the default. | 1006 // [JsStrategy] is the default. |
974 class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase | 1007 class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase |
975 with | 1008 with |
976 KernelToElementMapForImpactMixin, | 1009 KernelToElementMapForImpactMixin, |
977 KernelToElementMapForImpactImpl, | 1010 KernelToElementMapForImpactImpl, |
978 ElementCreatorMixin, | 1011 ElementCreatorMixin, |
979 KElementCreatorMixin { | 1012 KElementCreatorMixin { |
980 KernelToElementMapForImpactImpl2( | 1013 KernelToElementMapForImpactImpl2( |
981 DiagnosticReporter reporter, Environment environment) | 1014 DiagnosticReporter reporter, Environment environment) |
982 : super(reporter, environment); | 1015 : super(reporter, environment); |
| 1016 |
| 1017 @override |
| 1018 bool checkFamily(Entity entity) { |
| 1019 assert( |
| 1020 '$entity'.startsWith(kElementPrefix), |
| 1021 failedAt(entity, |
| 1022 "Unexpected entity $entity, expected family $kElementPrefix.")); |
| 1023 return true; |
| 1024 } |
983 } | 1025 } |
984 | 1026 |
985 abstract class KernelToElementMapForBuildingFromBaseMixin | 1027 abstract class KernelToElementMapForBuildingFromBaseMixin |
986 implements KernelToElementMapForBuilding, KernelToElementMapBase { | 1028 implements KernelToElementMapForBuilding, KernelToElementMapBase { |
987 @override | 1029 @override |
988 ConstantValue getFieldConstantValue(ir.Field field) { | 1030 ConstantValue getFieldConstantValue(ir.Field field) { |
989 // TODO(johnniwinther): Cache the result in [FieldData]. | 1031 // TODO(johnniwinther): Cache the result in [FieldData]. |
990 return getConstantValue(field.initializer, | 1032 return getConstantValue(field.initializer, |
991 requireConstant: field.isConst, implicitNull: !field.isConst); | 1033 requireConstant: field.isConst, implicitNull: !field.isConst); |
992 } | 1034 } |
(...skipping 25 matching lines...) Expand all Loading... |
1018 with | 1060 with |
1019 KernelToElementMapForBuildingMixin, | 1061 KernelToElementMapForBuildingMixin, |
1020 KernelToElementMapForBuildingFromBaseMixin, | 1062 KernelToElementMapForBuildingFromBaseMixin, |
1021 ElementCreatorMixin, | 1063 ElementCreatorMixin, |
1022 KElementCreatorMixin | 1064 KElementCreatorMixin |
1023 implements KernelToWorldBuilder { | 1065 implements KernelToWorldBuilder { |
1024 KernelToElementMapForBuildingImpl( | 1066 KernelToElementMapForBuildingImpl( |
1025 DiagnosticReporter reporter, Environment environment) | 1067 DiagnosticReporter reporter, Environment environment) |
1026 : super(reporter, environment); | 1068 : super(reporter, environment); |
1027 | 1069 |
| 1070 @override |
| 1071 bool checkFamily(Entity entity) { |
| 1072 assert( |
| 1073 '$entity'.startsWith(kElementPrefix), |
| 1074 failedAt(entity, |
| 1075 "Unexpected entity $entity, expected family $kElementPrefix.")); |
| 1076 return true; |
| 1077 } |
| 1078 |
1028 ConstantEnvironment get constantEnvironment => _constantEnvironment; | 1079 ConstantEnvironment get constantEnvironment => _constantEnvironment; |
1029 | 1080 |
1030 ir.Library getKernelLibrary(KLibrary entity) => | 1081 ir.Library getKernelLibrary(KLibrary entity) => |
1031 _libraryEnvs[entity.libraryIndex].library; | 1082 _libraryEnvs[entity.libraryIndex].library; |
1032 | 1083 |
1033 ir.Class getKernelClass(KClass entity) => _classEnvs[entity.classIndex].cls; | 1084 ir.Class getKernelClass(KClass entity) => _classEnvs[entity.classIndex].cls; |
1034 | 1085 |
1035 @override | 1086 @override |
1036 Spannable getSpannable(MemberEntity member, ir.Node node) { | 1087 Spannable getSpannable(MemberEntity member, ir.Node node) { |
1037 return _getSpannable(member, node); | 1088 return _getSpannable(member, node); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1424 @override | 1475 @override |
1425 String readFromEnvironment(String name) { | 1476 String readFromEnvironment(String name) { |
1426 return _environment.valueOf(name); | 1477 return _environment.valueOf(name); |
1427 } | 1478 } |
1428 } | 1479 } |
1429 | 1480 |
1430 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { | 1481 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { |
1431 final KernelToElementMapForImpactImpl elementMap; | 1482 final KernelToElementMapForImpactImpl elementMap; |
1432 | 1483 |
1433 KernelResolutionWorldBuilder( | 1484 KernelResolutionWorldBuilder( |
| 1485 CompilerOptions options, |
1434 this.elementMap, | 1486 this.elementMap, |
1435 NativeBasicData nativeBasicData, | 1487 NativeBasicData nativeBasicData, |
1436 NativeDataBuilder nativeDataBuilder, | 1488 NativeDataBuilder nativeDataBuilder, |
1437 InterceptorDataBuilder interceptorDataBuilder, | 1489 InterceptorDataBuilder interceptorDataBuilder, |
1438 BackendUsageBuilder backendUsageBuilder, | 1490 BackendUsageBuilder backendUsageBuilder, |
| 1491 RuntimeTypesNeedBuilder rtiNeedBuilder, |
| 1492 NativeResolutionEnqueuer nativeResolutionEnqueuer, |
1439 SelectorConstraintsStrategy selectorConstraintsStrategy) | 1493 SelectorConstraintsStrategy selectorConstraintsStrategy) |
1440 : super( | 1494 : super( |
| 1495 options, |
1441 elementMap.elementEnvironment, | 1496 elementMap.elementEnvironment, |
1442 elementMap.types, | 1497 elementMap.types, |
1443 elementMap.commonElements, | 1498 elementMap.commonElements, |
1444 elementMap._constantEnvironment.constantSystem, | 1499 elementMap._constantEnvironment.constantSystem, |
1445 nativeBasicData, | 1500 nativeBasicData, |
1446 nativeDataBuilder, | 1501 nativeDataBuilder, |
1447 interceptorDataBuilder, | 1502 interceptorDataBuilder, |
1448 backendUsageBuilder, | 1503 backendUsageBuilder, |
| 1504 rtiNeedBuilder, |
| 1505 nativeResolutionEnqueuer, |
1449 selectorConstraintsStrategy); | 1506 selectorConstraintsStrategy); |
1450 | 1507 |
1451 @override | 1508 @override |
1452 Iterable<InterfaceType> getSupertypes(ClassEntity cls) { | 1509 Iterable<InterfaceType> getSupertypes(ClassEntity cls) { |
1453 return elementMap._getOrderedTypeSet(cls).supertypes; | 1510 return elementMap._getOrderedTypeSet(cls).supertypes; |
1454 } | 1511 } |
1455 | 1512 |
1456 @override | 1513 @override |
1457 ClassEntity getSuperClass(ClassEntity cls) { | 1514 ClassEntity getSuperClass(ClassEntity cls) { |
1458 return elementMap._getSuperType(cls)?.element; | 1515 return elementMap._getSuperType(cls)?.element; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1540 bool checkInvariants(ClassEntity cls, {bool mustBeInstantiated: true}) => | 1597 bool checkInvariants(ClassEntity cls, {bool mustBeInstantiated: true}) => |
1541 true; | 1598 true; |
1542 | 1599 |
1543 @override | 1600 @override |
1544 bool checkClass(ClassEntity cls) => true; | 1601 bool checkClass(ClassEntity cls) => true; |
1545 | 1602 |
1546 @override | 1603 @override |
1547 bool checkEntity(Entity element) => true; | 1604 bool checkEntity(Entity element) => true; |
1548 } | 1605 } |
1549 | 1606 |
1550 class KernelClosedWorld extends ClosedWorldBase with KernelClosedWorldMixin { | 1607 class KernelClosedWorld extends ClosedWorldBase |
| 1608 with KernelClosedWorldMixin, ClosedWorldRtiNeedMixin { |
1551 final KernelToElementMapForImpactImpl elementMap; | 1609 final KernelToElementMapForImpactImpl elementMap; |
1552 | 1610 |
1553 KernelClosedWorld(this.elementMap, | 1611 KernelClosedWorld(this.elementMap, |
1554 {ElementEnvironment elementEnvironment, | 1612 {CompilerOptions options, |
| 1613 ElementEnvironment elementEnvironment, |
1555 DartTypes dartTypes, | 1614 DartTypes dartTypes, |
1556 CommonElements commonElements, | 1615 CommonElements commonElements, |
1557 ConstantSystem constantSystem, | 1616 ConstantSystem constantSystem, |
1558 NativeData nativeData, | 1617 NativeData nativeData, |
1559 InterceptorData interceptorData, | 1618 InterceptorData interceptorData, |
1560 BackendUsage backendUsage, | 1619 BackendUsage backendUsage, |
| 1620 ResolutionWorldBuilder resolutionWorldBuilder, |
| 1621 RuntimeTypesNeedBuilder rtiNeedBuilder, |
1561 Set<ClassEntity> implementedClasses, | 1622 Set<ClassEntity> implementedClasses, |
| 1623 Iterable<ClassEntity> liveNativeClasses, |
1562 Iterable<MemberEntity> liveInstanceMembers, | 1624 Iterable<MemberEntity> liveInstanceMembers, |
1563 Iterable<MemberEntity> assignedInstanceMembers, | 1625 Iterable<MemberEntity> assignedInstanceMembers, |
1564 Set<TypedefElement> allTypedefs, | 1626 Set<TypedefElement> allTypedefs, |
1565 Map<ClassEntity, Set<ClassEntity>> mixinUses, | 1627 Map<ClassEntity, Set<ClassEntity>> mixinUses, |
1566 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, | 1628 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, |
1567 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, | 1629 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, |
1568 Map<ClassEntity, ClassSet> classSets}) | 1630 Map<ClassEntity, ClassSet> classSets}) |
1569 : super( | 1631 : super( |
1570 elementEnvironment, | 1632 elementEnvironment, |
1571 dartTypes, | 1633 dartTypes, |
1572 commonElements, | 1634 commonElements, |
1573 constantSystem, | 1635 constantSystem, |
1574 nativeData, | 1636 nativeData, |
1575 interceptorData, | 1637 interceptorData, |
1576 backendUsage, | 1638 backendUsage, |
1577 implementedClasses, | 1639 implementedClasses, |
| 1640 liveNativeClasses, |
1578 liveInstanceMembers, | 1641 liveInstanceMembers, |
1579 assignedInstanceMembers, | 1642 assignedInstanceMembers, |
1580 allTypedefs, | 1643 allTypedefs, |
1581 mixinUses, | 1644 mixinUses, |
1582 typesImplementedBySubclasses, | 1645 typesImplementedBySubclasses, |
1583 classHierarchyNodes, | 1646 classHierarchyNodes, |
1584 classSets); | 1647 classSets) { |
| 1648 computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, |
| 1649 enableTypeAssertions: options.enableTypeAssertions); |
| 1650 } |
1585 | 1651 |
1586 @override | 1652 @override |
1587 void registerClosureClass(ClassElement cls) { | 1653 void registerClosureClass(ClassElement cls) { |
1588 throw new UnimplementedError('KernelClosedWorld.registerClosureClass'); | 1654 throw new UnimplementedError('KernelClosedWorld.registerClosureClass'); |
1589 } | 1655 } |
1590 } | 1656 } |
1591 | 1657 |
1592 // Interface for testing equivalence of Kernel-based entities. | 1658 // Interface for testing equivalence of Kernel-based entities. |
1593 class WorldDeconstructionForTesting { | 1659 class WorldDeconstructionForTesting { |
1594 final KernelToElementMapBase elementMap; | 1660 final KernelToElementMapBase elementMap; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1776 _constructorMap[data.node] = newMember; | 1842 _constructorMap[data.node] = newMember; |
1777 } else { | 1843 } else { |
1778 _methodMap[data.node] = newMember; | 1844 _methodMap[data.node] = newMember; |
1779 } | 1845 } |
1780 } | 1846 } |
1781 for (int typeVariableIndex = 0; | 1847 for (int typeVariableIndex = 0; |
1782 typeVariableIndex < _elementMap._typeVariableList.length; | 1848 typeVariableIndex < _elementMap._typeVariableList.length; |
1783 typeVariableIndex++) {} | 1849 typeVariableIndex++) {} |
1784 } | 1850 } |
1785 | 1851 |
| 1852 @override |
| 1853 bool checkFamily(Entity entity) { |
| 1854 assert( |
| 1855 '$entity'.startsWith(jsElementPrefix), |
| 1856 failedAt(entity, |
| 1857 "Unexpected entity $entity, expected family $jsElementPrefix.")); |
| 1858 return true; |
| 1859 } |
| 1860 |
1786 JsToFrontendMap get jsToFrontendMap => _jsToFrontendMap; | 1861 JsToFrontendMap get jsToFrontendMap => _jsToFrontendMap; |
1787 | 1862 |
1788 @override | 1863 @override |
1789 Spannable getSpannable(MemberEntity member, ir.Node node) { | 1864 Spannable getSpannable(MemberEntity member, ir.Node node) { |
1790 return _getSpannable(member, node); | 1865 return _getSpannable(member, node); |
1791 } | 1866 } |
1792 | 1867 |
1793 Iterable<LibraryEntity> get _libraries { | 1868 Iterable<LibraryEntity> get _libraries { |
1794 return _libraryMap.values; | 1869 return _libraryMap.values; |
1795 } | 1870 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1839 @override | 1914 @override |
1840 ir.Member getMemberNode(MemberEntity member) { | 1915 ir.Member getMemberNode(MemberEntity member) { |
1841 return _getMemberNode(member); | 1916 return _getMemberNode(member); |
1842 } | 1917 } |
1843 | 1918 |
1844 @override | 1919 @override |
1845 ir.Class getClassNode(ClassEntity cls) { | 1920 ir.Class getClassNode(ClassEntity cls) { |
1846 return _getClassNode(cls); | 1921 return _getClassNode(cls); |
1847 } | 1922 } |
1848 } | 1923 } |
OLD | NEW |