| 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; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 List<MemberEntity> _memberList = <MemberEntity>[]; | 77 List<MemberEntity> _memberList = <MemberEntity>[]; |
| 78 | 78 |
| 79 /// List of library environments by `IndexedLibrary.libraryIndex`. This is | 79 /// List of library environments by `IndexedLibrary.libraryIndex`. This is |
| 80 /// used for fast lookup into library classes and members. | 80 /// used for fast lookup into library classes and members. |
| 81 List<LibraryEnv> _libraryEnvs = <LibraryEnv>[]; | 81 List<LibraryEnv> _libraryEnvs = <LibraryEnv>[]; |
| 82 | 82 |
| 83 /// List of class environments by `IndexedClass.classIndex`. This is used for | 83 /// List of class environments by `IndexedClass.classIndex`. This is used for |
| 84 /// fast lookup into class members. | 84 /// fast lookup into class members. |
| 85 List<ClassEnv> _classEnvs = <ClassEnv>[]; | 85 List<ClassEnv> _classEnvs = <ClassEnv>[]; |
| 86 | 86 |
| 87 /// List of class data by `IndexedClass.classIndex`. This is used for |
| 88 /// fast lookup into class properties. |
| 89 List<ClassData> _classData = <ClassData>[]; |
| 90 |
| 87 /// List of member data by `IndexedMember.classIndex`. This is used for | 91 /// List of member data by `IndexedMember.classIndex`. This is used for |
| 88 /// fast lookup into member properties. | 92 /// fast lookup into member properties. |
| 89 List<MemberData> _memberData = <MemberData>[]; | 93 List<MemberData> _memberData = <MemberData>[]; |
| 90 | 94 |
| 91 KernelToElementMapBase(this.reporter, Environment environment) { | 95 KernelToElementMapBase(this.reporter, Environment environment) { |
| 92 _elementEnvironment = new KernelElementEnvironment(this); | 96 _elementEnvironment = new KernelElementEnvironment(this); |
| 93 _commonElements = new CommonElements(_elementEnvironment); | 97 _commonElements = new CommonElements(_elementEnvironment); |
| 94 _constantEnvironment = new KernelConstantEnvironment(this, environment); | 98 _constantEnvironment = new KernelConstantEnvironment(this, environment); |
| 95 _typeConverter = new DartTypeConverter(this); | 99 _typeConverter = new DartTypeConverter(this); |
| 96 _types = new _KernelDartTypes(this); | 100 _types = new _KernelDartTypes(this); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); | 186 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); |
| 183 | 187 |
| 184 LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]); | 188 LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]); |
| 185 | 189 |
| 186 @override | 190 @override |
| 187 ClassEntity getClass(ir.Class node) => _getClass(node); | 191 ClassEntity getClass(ir.Class node) => _getClass(node); |
| 188 | 192 |
| 189 ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]); | 193 ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]); |
| 190 | 194 |
| 191 InterfaceType _getSuperType(IndexedClass cls) { | 195 InterfaceType _getSuperType(IndexedClass cls) { |
| 192 ClassEnv env = _classEnvs[cls.classIndex]; | 196 ClassData data = _classData[cls.classIndex]; |
| 193 _ensureSupertypes(cls, env); | 197 _ensureSupertypes(cls, data); |
| 194 return env.supertype; | 198 return data.supertype; |
| 195 } | 199 } |
| 196 | 200 |
| 197 void _ensureThisAndRawType(ClassEntity cls, ClassEnv env) { | 201 void _ensureThisAndRawType(ClassEntity cls, ClassData data) { |
| 198 if (env.thisType == null) { | 202 if (data.thisType == null) { |
| 199 ir.Class node = env.cls; | 203 ir.Class node = data.cls; |
| 200 // TODO(johnniwinther): Add the type argument to the list literal when we | 204 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 201 // no longer use resolution types. | 205 // no longer use resolution types. |
| 202 if (node.typeParameters.isEmpty) { | 206 if (node.typeParameters.isEmpty) { |
| 203 env.thisType = | 207 data.thisType = |
| 204 env.rawType = new InterfaceType(cls, const/*<DartType>*/ []); | 208 data.rawType = new InterfaceType(cls, const/*<DartType>*/ []); |
| 205 } else { | 209 } else { |
| 206 env.thisType = new InterfaceType( | 210 data.thisType = new InterfaceType( |
| 207 cls, | 211 cls, |
| 208 new List/*<DartType>*/ .generate(node.typeParameters.length, | 212 new List/*<DartType>*/ .generate(node.typeParameters.length, |
| 209 (int index) { | 213 (int index) { |
| 210 return new TypeVariableType( | 214 return new TypeVariableType( |
| 211 _getTypeVariable(node.typeParameters[index])); | 215 _getTypeVariable(node.typeParameters[index])); |
| 212 })); | 216 })); |
| 213 env.rawType = new InterfaceType( | 217 data.rawType = new InterfaceType( |
| 214 cls, | 218 cls, |
| 215 new List/*<DartType>*/ .filled( | 219 new List/*<DartType>*/ .filled( |
| 216 node.typeParameters.length, const DynamicType())); | 220 node.typeParameters.length, const DynamicType())); |
| 217 } | 221 } |
| 218 } | 222 } |
| 219 } | 223 } |
| 220 | 224 |
| 221 TypeVariableEntity getTypeVariable(ir.TypeParameter node) => | 225 TypeVariableEntity getTypeVariable(ir.TypeParameter node) => |
| 222 _getTypeVariable(node); | 226 _getTypeVariable(node); |
| 223 | 227 |
| 224 TypeVariableEntity _getTypeVariable(ir.TypeParameter node); | 228 TypeVariableEntity _getTypeVariable(ir.TypeParameter node); |
| 225 | 229 |
| 226 void _ensureSupertypes(ClassEntity cls, ClassEnv env) { | 230 void _ensureSupertypes(ClassEntity cls, ClassData data) { |
| 227 if (env.orderedTypeSet == null) { | 231 if (data.orderedTypeSet == null) { |
| 228 _ensureThisAndRawType(cls, env); | 232 _ensureThisAndRawType(cls, data); |
| 229 | 233 |
| 230 ir.Class node = env.cls; | 234 ir.Class node = data.cls; |
| 231 | 235 |
| 232 if (node.supertype == null) { | 236 if (node.supertype == null) { |
| 233 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); | 237 data.orderedTypeSet = new OrderedTypeSet.singleton(data.thisType); |
| 234 env.isMixinApplication = false; | 238 data.isMixinApplication = false; |
| 235 env.interfaces = const <InterfaceType>[]; | 239 data.interfaces = const <InterfaceType>[]; |
| 236 } else { | 240 } else { |
| 237 InterfaceType processSupertype(ir.Supertype node) { | 241 InterfaceType processSupertype(ir.Supertype node) { |
| 238 InterfaceType type = _typeConverter.visitSupertype(node); | 242 InterfaceType supertype = _typeConverter.visitSupertype(node); |
| 239 IndexedClass superclass = type.element; | 243 IndexedClass superclass = supertype.element; |
| 240 ClassEnv env = _classEnvs[superclass.classIndex]; | 244 ClassData superdata = _classData[superclass.classIndex]; |
| 241 _ensureSupertypes(superclass, env); | 245 _ensureSupertypes(superclass, superdata); |
| 242 return type; | 246 return supertype; |
| 243 } | 247 } |
| 244 | 248 |
| 245 env.supertype = processSupertype(node.supertype); | 249 data.supertype = processSupertype(node.supertype); |
| 246 LinkBuilder<InterfaceType> linkBuilder = | 250 LinkBuilder<InterfaceType> linkBuilder = |
| 247 new LinkBuilder<InterfaceType>(); | 251 new LinkBuilder<InterfaceType>(); |
| 248 if (node.mixedInType != null) { | 252 if (node.mixedInType != null) { |
| 249 env.isMixinApplication = true; | 253 data.isMixinApplication = true; |
| 250 linkBuilder | 254 linkBuilder |
| 251 .addLast(env.mixedInType = processSupertype(node.mixedInType)); | 255 .addLast(data.mixedInType = processSupertype(node.mixedInType)); |
| 252 } else { | 256 } else { |
| 253 env.isMixinApplication = false; | 257 data.isMixinApplication = false; |
| 254 } | 258 } |
| 255 node.implementedTypes.forEach((ir.Supertype supertype) { | 259 node.implementedTypes.forEach((ir.Supertype supertype) { |
| 256 linkBuilder.addLast(processSupertype(supertype)); | 260 linkBuilder.addLast(processSupertype(supertype)); |
| 257 }); | 261 }); |
| 258 Link<InterfaceType> interfaces = linkBuilder.toLink(); | 262 Link<InterfaceType> interfaces = linkBuilder.toLink(); |
| 259 OrderedTypeSetBuilder setBuilder = | 263 OrderedTypeSetBuilder setBuilder = |
| 260 new _KernelOrderedTypeSetBuilder(this, cls); | 264 new _KernelOrderedTypeSetBuilder(this, cls); |
| 261 env.orderedTypeSet = | 265 data.orderedTypeSet = |
| 262 setBuilder.createOrderedTypeSet(env.supertype, interfaces); | 266 setBuilder.createOrderedTypeSet(data.supertype, interfaces); |
| 263 env.interfaces = new List<InterfaceType>.from(interfaces.toList()); | 267 data.interfaces = new List<InterfaceType>.from(interfaces.toList()); |
| 264 } | 268 } |
| 265 } | 269 } |
| 266 } | 270 } |
| 267 | 271 |
| 268 @override | 272 @override |
| 269 MemberEntity getMember(ir.Member node) { | 273 MemberEntity getMember(ir.Member node) { |
| 270 if (node is ir.Field) { | 274 if (node is ir.Field) { |
| 271 return _getField(node); | 275 return _getField(node); |
| 272 } else if (node is ir.Constructor) { | 276 } else if (node is ir.Constructor) { |
| 273 return _getConstructor(node); | 277 return _getConstructor(node); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 {bool requireConstant: true}) { | 389 {bool requireConstant: true}) { |
| 386 return _constantEnvironment.getConstantValue(constant); | 390 return _constantEnvironment.getConstantValue(constant); |
| 387 } | 391 } |
| 388 | 392 |
| 389 DartType _substByContext(DartType type, InterfaceType context) { | 393 DartType _substByContext(DartType type, InterfaceType context) { |
| 390 return type.subst( | 394 return type.subst( |
| 391 context.typeArguments, _getThisType(context.element).typeArguments); | 395 context.typeArguments, _getThisType(context.element).typeArguments); |
| 392 } | 396 } |
| 393 | 397 |
| 394 InterfaceType _getThisType(IndexedClass cls) { | 398 InterfaceType _getThisType(IndexedClass cls) { |
| 395 ClassEnv env = _classEnvs[cls.classIndex]; | 399 ClassData data = _classData[cls.classIndex]; |
| 396 _ensureThisAndRawType(cls, env); | 400 _ensureThisAndRawType(cls, data); |
| 397 return env.thisType; | 401 return data.thisType; |
| 398 } | 402 } |
| 399 | 403 |
| 400 InterfaceType _getRawType(IndexedClass cls) { | 404 InterfaceType _getRawType(IndexedClass cls) { |
| 401 ClassEnv env = _classEnvs[cls.classIndex]; | 405 ClassData data = _classData[cls.classIndex]; |
| 402 _ensureThisAndRawType(cls, env); | 406 _ensureThisAndRawType(cls, data); |
| 403 return env.rawType; | 407 return data.rawType; |
| 404 } | 408 } |
| 405 | 409 |
| 406 FunctionType _getFunctionType(IndexedFunction function) { | 410 FunctionType _getFunctionType(IndexedFunction function) { |
| 407 FunctionData data = _memberData[function.memberIndex]; | 411 FunctionData data = _memberData[function.memberIndex]; |
| 408 return data.getFunctionType(this); | 412 return data.getFunctionType(this); |
| 409 } | 413 } |
| 410 | 414 |
| 411 ClassEntity _getAppliedMixin(IndexedClass cls) { | 415 ClassEntity _getAppliedMixin(IndexedClass cls) { |
| 412 ClassEnv env = _classEnvs[cls.classIndex]; | 416 ClassData data = _classData[cls.classIndex]; |
| 413 _ensureSupertypes(cls, env); | 417 _ensureThisAndRawType(cls, data); |
| 414 return env.mixedInType?.element; | 418 return data.mixedInType?.element; |
| 415 } | 419 } |
| 416 | 420 |
| 417 bool _isMixinApplication(IndexedClass cls) { | 421 bool _isMixinApplication(IndexedClass cls) { |
| 418 ClassEnv env = _classEnvs[cls.classIndex]; | 422 ClassData data = _classData[cls.classIndex]; |
| 419 _ensureSupertypes(cls, env); | 423 _ensureThisAndRawType(cls, data); |
| 420 return env.isMixinApplication; | 424 return data.isMixinApplication; |
| 421 } | 425 } |
| 422 | 426 |
| 423 bool _isUnnamedMixinApplication(IndexedClass cls) { | 427 bool _isUnnamedMixinApplication(IndexedClass cls) { |
| 424 ClassEnv env = _classEnvs[cls.classIndex]; | 428 ClassEnv env = _classEnvs[cls.classIndex]; |
| 425 _ensureSupertypes(cls, env); | |
| 426 return env.isUnnamedMixinApplication; | 429 return env.isUnnamedMixinApplication; |
| 427 } | 430 } |
| 428 | 431 |
| 429 void _forEachSupertype(IndexedClass cls, void f(InterfaceType supertype)) { | 432 void _forEachSupertype(IndexedClass cls, void f(InterfaceType supertype)) { |
| 430 ClassEnv env = _classEnvs[cls.classIndex]; | 433 ClassData data = _classData[cls.classIndex]; |
| 431 _ensureSupertypes(cls, env); | 434 _ensureThisAndRawType(cls, data); |
| 432 env.orderedTypeSet.supertypes.forEach(f); | 435 data.orderedTypeSet.supertypes.forEach(f); |
| 433 } | 436 } |
| 434 | 437 |
| 435 void _forEachMixin(IndexedClass cls, void f(ClassEntity mixin)) { | 438 void _forEachMixin(IndexedClass cls, void f(ClassEntity mixin)) { |
| 436 while (cls != null) { | 439 while (cls != null) { |
| 437 ClassEnv env = _classEnvs[cls.classIndex]; | 440 ClassData data = _classData[cls.classIndex]; |
| 438 _ensureSupertypes(cls, env); | 441 _ensureThisAndRawType(cls, data); |
| 439 if (env.mixedInType != null) { | 442 if (data.mixedInType != null) { |
| 440 f(env.mixedInType.element); | 443 f(data.mixedInType.element); |
| 441 } | 444 } |
| 442 cls = env.supertype?.element; | 445 cls = data.supertype?.element; |
| 443 } | 446 } |
| 444 } | 447 } |
| 445 | 448 |
| 446 void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) { | 449 void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) { |
| 447 ClassEnv env = _classEnvs[cls.classIndex]; | 450 ClassEnv env = _classEnvs[cls.classIndex]; |
| 448 env.forEachConstructor((ir.Member member) { | 451 env.forEachConstructor((ir.Member member) { |
| 449 f(getConstructor(member)); | 452 f(getConstructor(member)); |
| 450 }); | 453 }); |
| 451 } | 454 } |
| 452 | 455 |
| 453 void _forEachClassMember( | 456 void _forEachClassMember( |
| 454 IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) { | 457 IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) { |
| 455 ClassEnv env = _classEnvs[cls.classIndex]; | 458 ClassEnv env = _classEnvs[cls.classIndex]; |
| 456 env.forEachMember((ir.Member member) { | 459 env.forEachMember((ir.Member member) { |
| 457 f(cls, getMember(member)); | 460 f(cls, getMember(member)); |
| 458 }); | 461 }); |
| 459 _ensureSupertypes(cls, env); | 462 ClassData data = _classData[cls.classIndex]; |
| 460 if (env.supertype != null) { | 463 _ensureSupertypes(cls, data); |
| 461 _forEachClassMember(env.supertype.element, f); | 464 if (data.supertype != null) { |
| 465 _forEachClassMember(data.supertype.element, f); |
| 462 } | 466 } |
| 463 } | 467 } |
| 464 | 468 |
| 465 ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) { | 469 ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) { |
| 466 ConstructorData data = _memberData[constructor.memberIndex]; | 470 ConstructorData data = _memberData[constructor.memberIndex]; |
| 467 return data.getConstructorConstant(this, constructor); | 471 return data.getConstructorConstant(this, constructor); |
| 468 } | 472 } |
| 469 | 473 |
| 470 ConstantExpression _getFieldConstant(IndexedField field) { | 474 ConstantExpression _getFieldConstant(IndexedField field) { |
| 471 FieldData data = _memberData[field.memberIndex]; | 475 FieldData data = _memberData[field.memberIndex]; |
| 472 return data.getFieldConstant(this, field); | 476 return data.getFieldConstant(this, field); |
| 473 } | 477 } |
| 474 | 478 |
| 475 InterfaceType _asInstanceOf(InterfaceType type, ClassEntity cls) { | 479 InterfaceType _asInstanceOf(InterfaceType type, ClassEntity cls) { |
| 476 OrderedTypeSet orderedTypeSet = _getOrderedTypeSet(type.element); | 480 OrderedTypeSet orderedTypeSet = _getOrderedTypeSet(type.element); |
| 477 InterfaceType supertype = | 481 InterfaceType supertype = |
| 478 orderedTypeSet.asInstanceOf(cls, _getHierarchyDepth(cls)); | 482 orderedTypeSet.asInstanceOf(cls, _getHierarchyDepth(cls)); |
| 479 if (supertype != null) { | 483 if (supertype != null) { |
| 480 supertype = _substByContext(supertype, type); | 484 supertype = _substByContext(supertype, type); |
| 481 } | 485 } |
| 482 return supertype; | 486 return supertype; |
| 483 } | 487 } |
| 484 | 488 |
| 485 OrderedTypeSet _getOrderedTypeSet(IndexedClass cls) { | 489 OrderedTypeSet _getOrderedTypeSet(IndexedClass cls) { |
| 486 ClassEnv env = _classEnvs[cls.classIndex]; | 490 ClassData data = _classData[cls.classIndex]; |
| 487 _ensureSupertypes(cls, env); | 491 _ensureThisAndRawType(cls, data); |
| 488 return env.orderedTypeSet; | 492 return data.orderedTypeSet; |
| 489 } | 493 } |
| 490 | 494 |
| 491 int _getHierarchyDepth(IndexedClass cls) { | 495 int _getHierarchyDepth(IndexedClass cls) { |
| 492 ClassEnv env = _classEnvs[cls.classIndex]; | 496 ClassData data = _classData[cls.classIndex]; |
| 493 _ensureSupertypes(cls, env); | 497 _ensureThisAndRawType(cls, data); |
| 494 return env.orderedTypeSet.maxDepth; | 498 return data.orderedTypeSet.maxDepth; |
| 495 } | 499 } |
| 496 | 500 |
| 497 Iterable<InterfaceType> _getInterfaces(IndexedClass cls) { | 501 Iterable<InterfaceType> _getInterfaces(IndexedClass cls) { |
| 498 ClassEnv env = _classEnvs[cls.classIndex]; | 502 ClassData data = _classData[cls.classIndex]; |
| 499 _ensureSupertypes(cls, env); | 503 _ensureThisAndRawType(cls, data); |
| 500 return env.interfaces; | 504 return data.interfaces; |
| 501 } | 505 } |
| 502 | 506 |
| 503 Spannable _getSpannable(MemberEntity member, ir.Node node) { | 507 Spannable _getSpannable(MemberEntity member, ir.Node node) { |
| 504 return member; | 508 return member; |
| 505 } | 509 } |
| 506 | 510 |
| 507 ir.Member _getMemberNode(covariant IndexedMember member) { | 511 ir.Member _getMemberNode(covariant IndexedMember member) { |
| 508 return _memberData[member.memberIndex].node; | 512 return _memberData[member.memberIndex].node; |
| 509 } | 513 } |
| 510 | 514 |
| 511 ir.Class _getClassNode(covariant IndexedClass cls) { | 515 ir.Class _getClassNode(covariant IndexedClass cls) { |
| 512 return _classEnvs[cls.classIndex].cls; | 516 return _classEnvs[cls.classIndex].cls; |
| 513 } | 517 } |
| 514 } | 518 } |
| 515 | 519 |
| 516 /// Mixin that implements the abstract methods in [KernelToElementMapBase] by | 520 /// Mixin that implements the abstract methods in [KernelToElementMapBase] by |
| 517 /// creating K-model elements. | 521 /// creating K-model elements. |
| 518 abstract class ElementCreatorMixin { | 522 abstract class ElementCreatorMixin { |
| 519 ProgramEnv get _env; | 523 ProgramEnv get _env; |
| 520 List<LibraryEntity> get _libraryList; | 524 List<LibraryEntity> get _libraryList; |
| 521 List<LibraryEnv> get _libraryEnvs; | 525 List<LibraryEnv> get _libraryEnvs; |
| 522 List<ClassEntity> get _classList; | 526 List<ClassEntity> get _classList; |
| 523 List<ClassEnv> get _classEnvs; | 527 List<ClassEnv> get _classEnvs; |
| 528 List<ClassData> get _classData; |
| 524 List<MemberEntity> get _memberList; | 529 List<MemberEntity> get _memberList; |
| 525 List<MemberData> get _memberData; | 530 List<MemberData> get _memberData; |
| 526 | 531 |
| 527 Map<ir.Library, IndexedLibrary> _libraryMap = <ir.Library, IndexedLibrary>{}; | 532 Map<ir.Library, IndexedLibrary> _libraryMap = <ir.Library, IndexedLibrary>{}; |
| 528 Map<ir.Class, IndexedClass> _classMap = <ir.Class, IndexedClass>{}; | 533 Map<ir.Class, IndexedClass> _classMap = <ir.Class, IndexedClass>{}; |
| 529 Map<ir.TypeParameter, TypeVariableEntity> _typeVariableMap = | 534 Map<ir.TypeParameter, TypeVariableEntity> _typeVariableMap = |
| 530 <ir.TypeParameter, TypeVariableEntity>{}; | 535 <ir.TypeParameter, TypeVariableEntity>{}; |
| 531 Map<ir.Member, IndexedConstructor> _constructorMap = | 536 Map<ir.Member, IndexedConstructor> _constructorMap = |
| 532 <ir.Member, IndexedConstructor>{}; | 537 <ir.Member, IndexedConstructor>{}; |
| 533 Map<ir.Procedure, IndexedFunction> _methodMap = | 538 Map<ir.Procedure, IndexedFunction> _methodMap = |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 }); | 571 }); |
| 567 } | 572 } |
| 568 | 573 |
| 569 ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) { | 574 ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) { |
| 570 return _classMap.putIfAbsent(node, () { | 575 return _classMap.putIfAbsent(node, () { |
| 571 KLibrary library = _getLibrary(node.enclosingLibrary); | 576 KLibrary library = _getLibrary(node.enclosingLibrary); |
| 572 if (classEnv == null) { | 577 if (classEnv == null) { |
| 573 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); | 578 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); |
| 574 } | 579 } |
| 575 _classEnvs.add(classEnv); | 580 _classEnvs.add(classEnv); |
| 581 _classData.add(new ClassData(node)); |
| 576 ClassEntity cls = createClass(library, _classMap.length, node.name, | 582 ClassEntity cls = createClass(library, _classMap.length, node.name, |
| 577 isAbstract: node.isAbstract); | 583 isAbstract: node.isAbstract); |
| 578 _classList.add(cls); | 584 _classList.add(cls); |
| 579 return cls; | 585 return cls; |
| 580 }); | 586 }); |
| 581 } | 587 } |
| 582 | 588 |
| 583 TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { | 589 TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { |
| 584 return _typeVariableMap.putIfAbsent(node, () { | 590 return _typeVariableMap.putIfAbsent(node, () { |
| 585 if (node.parent is ir.Class) { | 591 if (node.parent is ir.Class) { |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 941 ResolutionImpact computeWorldImpact(KMember member) { | 947 ResolutionImpact computeWorldImpact(KMember member) { |
| 942 return _memberData[member.memberIndex].getWorldImpact(this); | 948 return _memberData[member.memberIndex].getWorldImpact(this); |
| 943 } | 949 } |
| 944 | 950 |
| 945 /// Returns the kernel [ir.Procedure] node for the [method]. | 951 /// Returns the kernel [ir.Procedure] node for the [method]. |
| 946 ir.Procedure _lookupProcedure(KFunction method) { | 952 ir.Procedure _lookupProcedure(KFunction method) { |
| 947 return _memberData[method.memberIndex].node; | 953 return _memberData[method.memberIndex].node; |
| 948 } | 954 } |
| 949 | 955 |
| 950 Iterable<ConstantValue> _getClassMetadata(KClass cls) { | 956 Iterable<ConstantValue> _getClassMetadata(KClass cls) { |
| 951 return _classEnvs[cls.classIndex].getMetadata(this); | 957 return _classData[cls.classIndex].getMetadata(this); |
| 952 } | 958 } |
| 953 } | 959 } |
| 954 | 960 |
| 955 /// Implementation of [KernelToElementMapForImpact] that only supports world | 961 /// Implementation of [KernelToElementMapForImpact] that only supports world |
| 956 /// impact computation. | 962 /// impact computation. |
| 957 // TODO(johnniwinther): Merge this with [KernelToElementMapForImpactImpl] when | 963 // TODO(johnniwinther): Merge this with [KernelToElementMapForImpactImpl] when |
| 958 // [JsStrategy] is the default. | 964 // [JsStrategy] is the default. |
| 959 class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase | 965 class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase |
| 960 with | 966 with |
| 961 KernelToElementMapForImpactMixin, | 967 KernelToElementMapForImpactMixin, |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1074 InterfaceType getRawType(ClassEntity cls) { | 1080 InterfaceType getRawType(ClassEntity cls) { |
| 1075 return elementMap._getRawType(cls); | 1081 return elementMap._getRawType(cls); |
| 1076 } | 1082 } |
| 1077 | 1083 |
| 1078 @override | 1084 @override |
| 1079 bool isGenericClass(ClassEntity cls) { | 1085 bool isGenericClass(ClassEntity cls) { |
| 1080 return getThisType(cls).typeArguments.isNotEmpty; | 1086 return getThisType(cls).typeArguments.isNotEmpty; |
| 1081 } | 1087 } |
| 1082 | 1088 |
| 1083 @override | 1089 @override |
| 1084 bool isMixinApplication(covariant KClass cls) { | 1090 bool isMixinApplication(ClassEntity cls) { |
| 1085 return elementMap._isMixinApplication(cls); | 1091 return elementMap._isMixinApplication(cls); |
| 1086 } | 1092 } |
| 1087 | 1093 |
| 1088 @override | 1094 @override |
| 1089 bool isUnnamedMixinApplication(covariant KClass cls) { | 1095 bool isUnnamedMixinApplication(ClassEntity cls) { |
| 1090 return elementMap._isUnnamedMixinApplication(cls); | 1096 return elementMap._isUnnamedMixinApplication(cls); |
| 1091 } | 1097 } |
| 1092 | 1098 |
| 1093 @override | 1099 @override |
| 1094 ClassEntity getEffectiveMixinClass(ClassEntity cls) { | 1100 ClassEntity getEffectiveMixinClass(ClassEntity cls) { |
| 1095 if (!isMixinApplication(cls)) return null; | 1101 if (!isMixinApplication(cls)) return null; |
| 1096 do { | 1102 do { |
| 1097 cls = elementMap._getAppliedMixin(cls); | 1103 cls = elementMap._getAppliedMixin(cls); |
| 1098 } while (isMixinApplication(cls)); | 1104 } while (isMixinApplication(cls)); |
| 1099 return cls; | 1105 return cls; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1207 {bool required: false}) { | 1213 {bool required: false}) { |
| 1208 ClassEntity cls = elementMap.lookupClass(library, name); | 1214 ClassEntity cls = elementMap.lookupClass(library, name); |
| 1209 if (cls == null && required) { | 1215 if (cls == null && required) { |
| 1210 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 1216 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, |
| 1211 "The class '$name' was not found in library '${library.name}'."); | 1217 "The class '$name' was not found in library '${library.name}'."); |
| 1212 } | 1218 } |
| 1213 return cls; | 1219 return cls; |
| 1214 } | 1220 } |
| 1215 | 1221 |
| 1216 @override | 1222 @override |
| 1217 void forEachClass(covariant KLibrary library, void f(ClassEntity cls)) { | 1223 void forEachClass(LibraryEntity library, void f(ClassEntity cls)) { |
| 1218 elementMap._forEachClass(library, f); | 1224 elementMap._forEachClass(library, f); |
| 1219 } | 1225 } |
| 1220 | 1226 |
| 1221 @override | 1227 @override |
| 1222 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) { | 1228 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) { |
| 1223 LibraryEntity library = elementMap.lookupLibrary(uri); | 1229 LibraryEntity library = elementMap.lookupLibrary(uri); |
| 1224 if (library == null && required) { | 1230 if (library == null && required) { |
| 1225 throw new SpannableAssertionFailure( | 1231 throw new SpannableAssertionFailure( |
| 1226 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found."); | 1232 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found."); |
| 1227 } | 1233 } |
| 1228 return library; | 1234 return library; |
| 1229 } | 1235 } |
| 1230 | 1236 |
| 1231 @override | 1237 @override |
| 1232 bool isDeferredLoadLibraryGetter(covariant KMember member) { | 1238 bool isDeferredLoadLibraryGetter(MemberEntity member) { |
| 1233 // TODO(redemption): Support these. | 1239 // TODO(redemption): Support these. |
| 1234 return false; | 1240 return false; |
| 1235 } | 1241 } |
| 1236 | 1242 |
| 1237 @override | 1243 @override |
| 1238 Iterable<ConstantValue> getMemberMetadata(covariant KMember member) { | 1244 Iterable<ConstantValue> getMemberMetadata(covariant IndexedMember member) { |
| 1239 MemberData memberData = elementMap._memberData[member.memberIndex]; | 1245 MemberData memberData = elementMap._memberData[member.memberIndex]; |
| 1240 return memberData.getMetadata(elementMap); | 1246 return memberData.getMetadata(elementMap); |
| 1241 } | 1247 } |
| 1242 } | 1248 } |
| 1243 | 1249 |
| 1244 /// Visitor that converts kernel dart types into [DartType]. | 1250 /// Visitor that converts kernel dart types into [DartType]. |
| 1245 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { | 1251 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { |
| 1246 final KernelToElementMapBase elementMap; | 1252 final KernelToElementMapBase elementMap; |
| 1247 bool topLevel = true; | 1253 bool topLevel = true; |
| 1248 | 1254 |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1705 LibraryEntity oldLibrary = _elementMap._libraryList[libraryIndex]; | 1711 LibraryEntity oldLibrary = _elementMap._libraryList[libraryIndex]; |
| 1706 LibraryEntity newLibrary = convertLibrary(oldLibrary); | 1712 LibraryEntity newLibrary = convertLibrary(oldLibrary); |
| 1707 _libraryMap[env.library] = newLibrary; | 1713 _libraryMap[env.library] = newLibrary; |
| 1708 _libraryList.add(newLibrary); | 1714 _libraryList.add(newLibrary); |
| 1709 _libraryEnvs.add(env); | 1715 _libraryEnvs.add(env); |
| 1710 } | 1716 } |
| 1711 for (int classIndex = 0; | 1717 for (int classIndex = 0; |
| 1712 classIndex < _elementMap._classEnvs.length; | 1718 classIndex < _elementMap._classEnvs.length; |
| 1713 classIndex++) { | 1719 classIndex++) { |
| 1714 ClassEnv env = _elementMap._classEnvs[classIndex]; | 1720 ClassEnv env = _elementMap._classEnvs[classIndex]; |
| 1721 ClassData data = _elementMap._classData[classIndex]; |
| 1715 ClassEntity oldClass = _elementMap._classList[classIndex]; | 1722 ClassEntity oldClass = _elementMap._classList[classIndex]; |
| 1716 IndexedLibrary oldLibrary = oldClass.library; | 1723 IndexedLibrary oldLibrary = oldClass.library; |
| 1717 LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex]; | 1724 LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex]; |
| 1718 ClassEntity newClass = convertClass(newLibrary, oldClass); | 1725 ClassEntity newClass = convertClass(newLibrary, oldClass); |
| 1719 _classMap[env.cls] = newClass; | 1726 _classMap[env.cls] = newClass; |
| 1720 _classList.add(newClass); | 1727 _classList.add(newClass); |
| 1721 _classEnvs.add(env); | 1728 _classEnvs.add(env); |
| 1729 _classData.add(data.copy()); |
| 1722 } | 1730 } |
| 1723 for (int memberIndex = 0; | 1731 for (int memberIndex = 0; |
| 1724 memberIndex < _elementMap._memberData.length; | 1732 memberIndex < _elementMap._memberData.length; |
| 1725 memberIndex++) { | 1733 memberIndex++) { |
| 1726 MemberData data = _elementMap._memberData[memberIndex]; | 1734 MemberData data = _elementMap._memberData[memberIndex]; |
| 1727 MemberEntity oldMember = _elementMap._memberList[memberIndex]; | 1735 MemberEntity oldMember = _elementMap._memberList[memberIndex]; |
| 1728 IndexedLibrary oldLibrary = oldMember.library; | 1736 IndexedLibrary oldLibrary = oldMember.library; |
| 1729 IndexedClass oldClass = oldMember.enclosingClass; | 1737 IndexedClass oldClass = oldMember.enclosingClass; |
| 1730 LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex]; | 1738 LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex]; |
| 1731 ClassEntity newClass = | 1739 ClassEntity newClass = |
| 1732 oldClass != null ? _classList[oldClass.classIndex] : null; | 1740 oldClass != null ? _classList[oldClass.classIndex] : null; |
| 1733 IndexedMember newMember = convertMember(newLibrary, newClass, oldMember); | 1741 IndexedMember newMember = convertMember(newLibrary, newClass, oldMember); |
| 1734 _memberList.add(newMember); | 1742 _memberList.add(newMember); |
| 1735 _memberData.add(data); | 1743 _memberData.add(data.copy()); |
| 1736 if (newMember.isField) { | 1744 if (newMember.isField) { |
| 1737 _fieldMap[data.node] = newMember; | 1745 _fieldMap[data.node] = newMember; |
| 1738 } else if (newMember.isConstructor) { | 1746 } else if (newMember.isConstructor) { |
| 1739 _constructorMap[data.node] = newMember; | 1747 _constructorMap[data.node] = newMember; |
| 1740 } else { | 1748 } else { |
| 1741 _methodMap[data.node] = newMember; | 1749 _methodMap[data.node] = newMember; |
| 1742 } | 1750 } |
| 1743 } | 1751 } |
| 1744 } | 1752 } |
| 1745 | 1753 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1766 throw new UnsupportedError("JsKernelToElementMap.getLocalFunction"); | 1774 throw new UnsupportedError("JsKernelToElementMap.getLocalFunction"); |
| 1767 } | 1775 } |
| 1768 | 1776 |
| 1769 @override | 1777 @override |
| 1770 ClassEntity _getClass(ir.Class node, [ClassEnv env]) { | 1778 ClassEntity _getClass(ir.Class node, [ClassEnv env]) { |
| 1771 ClassEntity cls = _classMap[node]; | 1779 ClassEntity cls = _classMap[node]; |
| 1772 assert(cls != null, "No class entity for $node"); | 1780 assert(cls != null, "No class entity for $node"); |
| 1773 return cls; | 1781 return cls; |
| 1774 } | 1782 } |
| 1775 | 1783 |
| 1776 @override | |
| 1777 TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { | |
| 1778 throw new UnsupportedError("JsKernelToElementMap._getTypeVariable"); | |
| 1779 } | |
| 1780 | |
| 1781 // TODO(johnniwinther): Reinsert these when [ElementCreatorMixin] is no longer | 1784 // TODO(johnniwinther): Reinsert these when [ElementCreatorMixin] is no longer |
| 1782 // mixed in. | 1785 // mixed in. |
| 1783 /*@override | 1786 /*@override |
| 1784 FieldEntity _getField(ir.Field node) { | 1787 FieldEntity _getField(ir.Field node) { |
| 1785 FieldEntity field = _fieldMap[node]; | 1788 FieldEntity field = _fieldMap[node]; |
| 1786 assert(field != null, "No field entity for $node"); | 1789 assert(field != null, "No field entity for $node"); |
| 1787 return field; | 1790 return field; |
| 1788 }*/ | 1791 }*/ |
| 1789 | 1792 |
| 1790 /*@override | 1793 /*@override |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1827 throw new UnsupportedError( | 1830 throw new UnsupportedError( |
| 1828 "JsKernelToElementMap.getConstantFieldInitializer"); | 1831 "JsKernelToElementMap.getConstantFieldInitializer"); |
| 1829 } | 1832 } |
| 1830 | 1833 |
| 1831 @override | 1834 @override |
| 1832 bool hasConstantFieldInitializer(FieldEntity field) { | 1835 bool hasConstantFieldInitializer(FieldEntity field) { |
| 1833 throw new UnsupportedError( | 1836 throw new UnsupportedError( |
| 1834 "JsKernelToElementMap.hasConstantFieldInitializer"); | 1837 "JsKernelToElementMap.hasConstantFieldInitializer"); |
| 1835 } | 1838 } |
| 1836 } | 1839 } |
| OLD | NEW |