| 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.world_builder; | 5 library dart2js.kernel.world_builder; |
| 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/resolution.dart'; | 10 import '../common/resolution.dart'; |
| 11 import '../compile_time_constants.dart'; | 11 import '../compile_time_constants.dart'; |
| 12 import '../constants/constant_system.dart'; | 12 import '../constants/constant_system.dart'; |
| 13 import '../constants/constructors.dart'; | 13 import '../constants/constructors.dart'; |
| 14 import '../constants/evaluation.dart'; | 14 import '../constants/evaluation.dart'; |
| 15 import '../constants/expressions.dart'; | 15 import '../constants/expressions.dart'; |
| 16 import '../constants/values.dart'; | 16 import '../constants/values.dart'; |
| 17 import '../common_elements.dart'; | 17 import '../common_elements.dart'; |
| 18 import '../elements/elements.dart'; | 18 import '../elements/elements.dart'; |
| 19 import '../elements/entities.dart'; | 19 import '../elements/entities.dart'; |
| 20 import '../elements/types.dart'; | 20 import '../elements/types.dart'; |
| 21 import '../js_backend/constant_system_javascript.dart'; | 21 import '../js_backend/constant_system_javascript.dart'; |
| 22 import '../js_backend/native_data.dart'; | 22 import '../js_backend/native_data.dart'; |
| 23 import '../js_backend/no_such_method_registry.dart'; | 23 import '../js_backend/no_such_method_registry.dart'; |
| 24 import '../native/native.dart' as native; | 24 import '../native/native.dart' as native; |
| 25 import '../native/resolver.dart'; | 25 import '../native/resolver.dart'; |
| 26 import '../ordered_typeset.dart'; |
| 26 import '../ssa/kernel_impact.dart'; | 27 import '../ssa/kernel_impact.dart'; |
| 27 import '../universe/call_structure.dart'; | 28 import '../universe/call_structure.dart'; |
| 29 import '../util/util.dart' show Link, LinkBuilder; |
| 28 import 'element_adapter.dart'; | 30 import 'element_adapter.dart'; |
| 29 import 'elements.dart'; | 31 import 'elements.dart'; |
| 30 | 32 |
| 31 part 'native_basic_data.dart'; | 33 part 'native_basic_data.dart'; |
| 32 part 'native_class_resolver.dart'; | 34 part 'native_class_resolver.dart'; |
| 33 part 'no_such_method_resolver.dart'; | 35 part 'no_such_method_resolver.dart'; |
| 36 part 'types.dart'; |
| 34 | 37 |
| 35 /// World builder used for creating elements and types corresponding to Kernel | 38 /// World builder used for creating elements and types corresponding to Kernel |
| 36 /// IR nodes. | 39 /// IR nodes. |
| 37 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. | 40 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. |
| 38 class KernelWorldBuilder extends KernelElementAdapterMixin { | 41 class KernelWorldBuilder extends KernelElementAdapterMixin { |
| 39 CommonElements _commonElements; | 42 CommonElements _commonElements; |
| 40 native.BehaviorBuilder _nativeBehaviorBuilder; | 43 native.BehaviorBuilder _nativeBehaviorBuilder; |
| 41 final DiagnosticReporter reporter; | 44 final DiagnosticReporter reporter; |
| 42 ElementEnvironment _elementEnvironment; | 45 ElementEnvironment _elementEnvironment; |
| 43 DartTypeConverter _typeConverter; | 46 DartTypeConverter _typeConverter; |
| 44 KernelConstantEnvironment _constantEnvironment; | 47 KernelConstantEnvironment _constantEnvironment; |
| 48 _KernelDartTypes _types; |
| 45 | 49 |
| 46 /// Library environment. Used for fast lookup. | 50 /// Library environment. Used for fast lookup. |
| 47 KEnv _env; | 51 KEnv _env; |
| 48 | 52 |
| 49 /// List of library environments by `KLibrary.libraryIndex`. This is used for | 53 /// List of library environments by `KLibrary.libraryIndex`. This is used for |
| 50 /// fast lookup into library classes and members. | 54 /// fast lookup into library classes and members. |
| 51 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[]; | 55 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[]; |
| 52 | 56 |
| 53 /// List of class environments by `KClass.classIndex`. This is used for | 57 /// List of class environments by `KClass.classIndex`. This is used for |
| 54 /// fast lookup into class members. | 58 /// fast lookup into class members. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 76 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = | 80 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = |
| 77 <ir.TreeNode, KLocalFunction>{}; | 81 <ir.TreeNode, KLocalFunction>{}; |
| 78 | 82 |
| 79 KernelWorldBuilder(this.reporter, ir.Program program) | 83 KernelWorldBuilder(this.reporter, ir.Program program) |
| 80 : _env = new KEnv(program) { | 84 : _env = new KEnv(program) { |
| 81 _elementEnvironment = new KernelElementEnvironment(this); | 85 _elementEnvironment = new KernelElementEnvironment(this); |
| 82 _commonElements = new CommonElements(_elementEnvironment); | 86 _commonElements = new CommonElements(_elementEnvironment); |
| 83 _constantEnvironment = new KernelConstantEnvironment(this); | 87 _constantEnvironment = new KernelConstantEnvironment(this); |
| 84 _nativeBehaviorBuilder = | 88 _nativeBehaviorBuilder = |
| 85 new KernelBehaviorBuilder(_commonElements, _constantEnvironment); | 89 new KernelBehaviorBuilder(_commonElements, _constantEnvironment); |
| 90 _types = new _KernelDartTypes(this); |
| 86 _typeConverter = new DartTypeConverter(this); | 91 _typeConverter = new DartTypeConverter(this); |
| 87 } | 92 } |
| 88 | 93 |
| 89 KMethod get _mainFunction { | 94 KMethod get _mainFunction { |
| 90 return _env.program.mainMethod != null | 95 return _env.program.mainMethod != null |
| 91 ? _getMethod(_env.program.mainMethod) | 96 ? _getMethod(_env.program.mainMethod) |
| 92 : null; | 97 : null; |
| 93 } | 98 } |
| 94 | 99 |
| 95 KLibrary get _mainLibrary { | 100 KLibrary get _mainLibrary { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 109 } | 114 } |
| 110 | 115 |
| 111 @override | 116 @override |
| 112 CommonElements get commonElements => _commonElements; | 117 CommonElements get commonElements => _commonElements; |
| 113 | 118 |
| 114 @override | 119 @override |
| 115 ElementEnvironment get elementEnvironment => _elementEnvironment; | 120 ElementEnvironment get elementEnvironment => _elementEnvironment; |
| 116 | 121 |
| 117 ConstantEnvironment get constantEnvironment => _constantEnvironment; | 122 ConstantEnvironment get constantEnvironment => _constantEnvironment; |
| 118 | 123 |
| 124 DartTypes get types => _types; |
| 125 |
| 119 @override | 126 @override |
| 120 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder; | 127 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder; |
| 121 | 128 |
| 122 LibraryEntity lookupLibrary(Uri uri) { | 129 LibraryEntity lookupLibrary(Uri uri) { |
| 123 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); | 130 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); |
| 124 return _getLibrary(libraryEnv.library, libraryEnv); | 131 return _getLibrary(libraryEnv.library, libraryEnv); |
| 125 } | 132 } |
| 126 | 133 |
| 127 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { | 134 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { |
| 128 return _libraryMap.putIfAbsent(node, () { | 135 return _libraryMap.putIfAbsent(node, () { |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 return env.thisType; | 415 return env.thisType; |
| 409 } | 416 } |
| 410 | 417 |
| 411 InterfaceType _getRawType(KClass cls) { | 418 InterfaceType _getRawType(KClass cls) { |
| 412 KClassEnv env = _classEnvs[cls.classIndex]; | 419 KClassEnv env = _classEnvs[cls.classIndex]; |
| 413 _ensureThisAndRawType(cls, env); | 420 _ensureThisAndRawType(cls, env); |
| 414 return env.rawType; | 421 return env.rawType; |
| 415 } | 422 } |
| 416 | 423 |
| 417 void _ensureSupertypes(KClass cls, KClassEnv env) { | 424 void _ensureSupertypes(KClass cls, KClassEnv env) { |
| 418 if (env.supertypes == null) { | 425 if (env.orderedTypeSet == null) { |
| 419 _ensureThisAndRawType(cls, env); | 426 _ensureThisAndRawType(cls, env); |
| 420 | 427 |
| 421 ir.Class node = env.cls; | 428 ir.Class node = env.cls; |
| 422 | 429 |
| 423 Set<InterfaceType> supertypes = new Set<InterfaceType>(); | 430 if (node.supertype == null) { |
| 431 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); |
| 432 } else { |
| 433 InterfaceType processSupertype(ir.Supertype node) { |
| 434 InterfaceType type = _typeConverter.visitSupertype(node); |
| 435 KClass superclass = type.element; |
| 436 KClassEnv env = _classEnvs[superclass.classIndex]; |
| 437 _ensureSupertypes(superclass, env); |
| 438 return type; |
| 439 } |
| 424 | 440 |
| 425 InterfaceType addSupertype(ir.Supertype node) { | 441 env.supertype = processSupertype(node.supertype); |
| 426 if (node == null) return null; | 442 LinkBuilder<InterfaceType> linkBuilder = |
| 427 InterfaceType type = _typeConverter.visitSupertype(node); | 443 new LinkBuilder<InterfaceType>(); |
| 428 KClass superclass = type.element; | 444 if (node.mixedInType != null) { |
| 429 KClassEnv env = _classEnvs[superclass.classIndex]; | 445 linkBuilder.addLast(processSupertype(node.mixedInType)); |
| 430 _ensureSupertypes(superclass, env); | |
| 431 for (InterfaceType supertype in env.supertypes) { | |
| 432 supertypes.add( | |
| 433 supertype.subst(type.typeArguments, env.thisType.typeArguments)); | |
| 434 } | 446 } |
| 435 return type; | 447 node.implementedTypes.forEach((ir.Supertype supertype) { |
| 448 linkBuilder.addLast(processSupertype(supertype)); |
| 449 }); |
| 450 Link<InterfaceType> interfaces = linkBuilder.toLink(); |
| 451 OrderedTypeSetBuilder setBuilder = |
| 452 new _KernelOrderedTypeSetBuilder(this, cls); |
| 453 env.orderedTypeSet = |
| 454 setBuilder.createOrderedTypeSet(env.supertype, interfaces); |
| 436 } | 455 } |
| 437 | |
| 438 env.supertype = addSupertype(node.supertype); | |
| 439 addSupertype(node.mixedInType); | |
| 440 node.implementedTypes.forEach(addSupertype); | |
| 441 | |
| 442 env.supertypes = supertypes.toList(); | |
| 443 } | 456 } |
| 444 } | 457 } |
| 445 | 458 |
| 459 OrderedTypeSet _getOrderedTypeSet(KClass cls) { |
| 460 KClassEnv env = _classEnvs[cls.classIndex]; |
| 461 _ensureSupertypes(cls, env); |
| 462 return env.orderedTypeSet; |
| 463 } |
| 464 |
| 465 int _getHierarchyDepth(KClass cls) { |
| 466 KClassEnv env = _classEnvs[cls.classIndex]; |
| 467 _ensureSupertypes(cls, env); |
| 468 return env.orderedTypeSet.maxDepth; |
| 469 } |
| 470 |
| 471 InterfaceType _substByContext(InterfaceType type, InterfaceType context) { |
| 472 return type.subst( |
| 473 context.typeArguments, _getThisType(context.element).typeArguments); |
| 474 } |
| 475 |
| 446 InterfaceType _getSuperType(KClass cls) { | 476 InterfaceType _getSuperType(KClass cls) { |
| 447 KClassEnv env = _classEnvs[cls.classIndex]; | 477 KClassEnv env = _classEnvs[cls.classIndex]; |
| 448 _ensureSupertypes(cls, env); | 478 _ensureSupertypes(cls, env); |
| 449 return env.supertype; | 479 return env.supertype; |
| 450 } | 480 } |
| 451 | 481 |
| 452 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { | 482 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { |
| 453 KClassEnv env = _classEnvs[cls.classIndex]; | 483 KClassEnv env = _classEnvs[cls.classIndex]; |
| 454 _ensureSupertypes(cls, env); | 484 _ensureSupertypes(cls, env); |
| 455 env.supertypes.forEach(f); | 485 env.orderedTypeSet.supertypes.forEach(f); |
| 486 } |
| 487 |
| 488 void _forEachClassMember( |
| 489 KClass cls, void f(ClassEntity cls, MemberEntity member)) { |
| 490 KClassEnv env = _classEnvs[cls.classIndex]; |
| 491 env.forEachMember((ir.Member member) { |
| 492 f(cls, getMember(member)); |
| 493 }); |
| 494 _ensureSupertypes(cls, env); |
| 495 if (env.supertype != null) { |
| 496 _forEachClassMember(env.supertype.element, f); |
| 497 } |
| 456 } | 498 } |
| 457 | 499 |
| 458 @override | 500 @override |
| 459 FunctionType getFunctionType(ir.FunctionNode node) { | 501 FunctionType getFunctionType(ir.FunctionNode node) { |
| 460 DartType returnType = getDartType(node.returnType); | 502 DartType returnType = getDartType(node.returnType); |
| 461 List<DartType> parameterTypes = /*<DartType>*/ []; | 503 List<DartType> parameterTypes = /*<DartType>*/ []; |
| 462 List<DartType> optionalParameterTypes = /*<DartType>*/ []; | 504 List<DartType> optionalParameterTypes = /*<DartType>*/ []; |
| 463 for (ir.VariableDeclaration variable in node.positionalParameters) { | 505 for (ir.VariableDeclaration variable in node.positionalParameters) { |
| 464 if (parameterTypes.length == node.requiredParameterCount) { | 506 if (parameterTypes.length == node.requiredParameterCount) { |
| 465 optionalParameterTypes.add(getDartType(variable.type)); | 507 optionalParameterTypes.add(getDartType(variable.type)); |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 } | 675 } |
| 634 | 676 |
| 635 /// Environment for fast lookup of class members. | 677 /// Environment for fast lookup of class members. |
| 636 // TODO(johnniwinther): Add member lookup. | 678 // TODO(johnniwinther): Add member lookup. |
| 637 class KClassEnv { | 679 class KClassEnv { |
| 638 final ir.Class cls; | 680 final ir.Class cls; |
| 639 | 681 |
| 640 InterfaceType thisType; | 682 InterfaceType thisType; |
| 641 InterfaceType rawType; | 683 InterfaceType rawType; |
| 642 InterfaceType supertype; | 684 InterfaceType supertype; |
| 643 List<InterfaceType> supertypes; | 685 OrderedTypeSet orderedTypeSet; |
| 644 | 686 |
| 645 Map<String, ir.Member> _constructorMap; | 687 Map<String, ir.Member> _constructorMap; |
| 646 Map<String, ir.Member> _memberMap; | 688 Map<String, ir.Member> _memberMap; |
| 647 | 689 |
| 648 Iterable<ConstantExpression> _metadata; | 690 Iterable<ConstantExpression> _metadata; |
| 649 | 691 |
| 650 KClassEnv(this.cls); | 692 KClassEnv(this.cls); |
| 651 | 693 |
| 652 void _ensureMaps() { | 694 void _ensureMaps() { |
| 653 if (_memberMap == null) { | 695 if (_memberMap == null) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 672 _ensureMaps(); | 714 _ensureMaps(); |
| 673 return _memberMap[name]; | 715 return _memberMap[name]; |
| 674 } | 716 } |
| 675 | 717 |
| 676 /// Return the [ir.Member] for the member [name] in [library]. | 718 /// Return the [ir.Member] for the member [name] in [library]. |
| 677 ir.Member lookupConstructor(String name, {bool setter: false}) { | 719 ir.Member lookupConstructor(String name, {bool setter: false}) { |
| 678 _ensureMaps(); | 720 _ensureMaps(); |
| 679 return _constructorMap[name]; | 721 return _constructorMap[name]; |
| 680 } | 722 } |
| 681 | 723 |
| 724 void forEachMember(f(ir.Member member)) { |
| 725 _ensureMaps(); |
| 726 _memberMap.values.forEach(f); |
| 727 } |
| 728 |
| 682 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) { | 729 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) { |
| 683 if (_metadata == null) { | 730 if (_metadata == null) { |
| 684 _metadata = worldBuilder.getMetadata(cls.annotations); | 731 _metadata = worldBuilder.getMetadata(cls.annotations); |
| 685 } | 732 } |
| 686 return _metadata; | 733 return _metadata; |
| 687 } | 734 } |
| 688 } | 735 } |
| 689 | 736 |
| 690 class KernelElementEnvironment implements ElementEnvironment { | 737 class KernelElementEnvironment implements ElementEnvironment { |
| 691 final KernelWorldBuilder worldBuilder; | 738 final KernelWorldBuilder worldBuilder; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 721 } | 768 } |
| 722 | 769 |
| 723 @override | 770 @override |
| 724 InterfaceType createInterfaceType( | 771 InterfaceType createInterfaceType( |
| 725 ClassEntity cls, List<DartType> typeArguments) { | 772 ClassEntity cls, List<DartType> typeArguments) { |
| 726 return new InterfaceType(cls, typeArguments); | 773 return new InterfaceType(cls, typeArguments); |
| 727 } | 774 } |
| 728 | 775 |
| 729 @override | 776 @override |
| 730 bool isSubtype(DartType a, DartType b) { | 777 bool isSubtype(DartType a, DartType b) { |
| 731 // TODO(johnniwinther): Implement this. | 778 return worldBuilder.types.isSubtype(a, b); |
| 732 return false; | |
| 733 } | 779 } |
| 734 | 780 |
| 735 @override | 781 @override |
| 736 FunctionType getFunctionType(KFunction function) { | 782 FunctionType getFunctionType(KFunction function) { |
| 737 throw new UnimplementedError('KernelElementEnvironment.getFunctionType'); | 783 throw new UnimplementedError('KernelElementEnvironment.getFunctionType'); |
| 738 } | 784 } |
| 739 | 785 |
| 740 @override | 786 @override |
| 741 FunctionType getLocalFunctionType(KLocalFunction function) { | 787 FunctionType getLocalFunctionType(KLocalFunction function) { |
| 742 return function.functionType; | 788 return function.functionType; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 } | 827 } |
| 782 | 828 |
| 783 @override | 829 @override |
| 784 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) { | 830 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) { |
| 785 throw new UnimplementedError('KernelElementEnvironment.forEachMixin'); | 831 throw new UnimplementedError('KernelElementEnvironment.forEachMixin'); |
| 786 } | 832 } |
| 787 | 833 |
| 788 @override | 834 @override |
| 789 void forEachClassMember( | 835 void forEachClassMember( |
| 790 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { | 836 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { |
| 791 // TODO(johnniwinther): Implement this. | 837 worldBuilder._forEachClassMember(cls, f); |
| 792 } | 838 } |
| 793 | 839 |
| 794 @override | 840 @override |
| 795 MemberEntity lookupLibraryMember(LibraryEntity library, String name, | 841 MemberEntity lookupLibraryMember(LibraryEntity library, String name, |
| 796 {bool setter: false, bool required: false}) { | 842 {bool setter: false, bool required: false}) { |
| 797 MemberEntity member = | 843 MemberEntity member = |
| 798 worldBuilder.lookupLibraryMember(library, name, setter: setter); | 844 worldBuilder.lookupLibraryMember(library, name, setter: setter); |
| 799 if (member == null && required) { | 845 if (member == null && required) { |
| 800 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 846 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, |
| 801 "The member '${name}' was not found in library '${library.name}'."); | 847 "The member '${name}' was not found in library '${library.name}'."); |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1071 } | 1117 } |
| 1072 | 1118 |
| 1073 InterfaceType getMixinTypeForClass(KClass cls) { | 1119 InterfaceType getMixinTypeForClass(KClass cls) { |
| 1074 KClassEnv env = builder._classEnvs[cls.classIndex]; | 1120 KClassEnv env = builder._classEnvs[cls.classIndex]; |
| 1075 ir.Supertype mixedInType = env.cls.mixedInType; | 1121 ir.Supertype mixedInType = env.cls.mixedInType; |
| 1076 if (mixedInType == null) return null; | 1122 if (mixedInType == null) return null; |
| 1077 return builder.createInterfaceType( | 1123 return builder.createInterfaceType( |
| 1078 mixedInType.classNode, mixedInType.typeArguments); | 1124 mixedInType.classNode, mixedInType.typeArguments); |
| 1079 } | 1125 } |
| 1080 } | 1126 } |
| OLD | NEW |