| 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 |