| 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'; |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 } | 630 } |
| 631 } | 631 } |
| 632 | 632 |
| 633 /// Environment for fast lookup of library classes and members. | 633 /// Environment for fast lookup of library classes and members. |
| 634 // TODO(johnniwinther): Add member lookup. | 634 // TODO(johnniwinther): Add member lookup. |
| 635 class KLibraryEnv { | 635 class KLibraryEnv { |
| 636 final ir.Library library; | 636 final ir.Library library; |
| 637 | 637 |
| 638 Map<String, KClassEnv> _classMap; | 638 Map<String, KClassEnv> _classMap; |
| 639 Map<String, ir.Member> _memberMap; | 639 Map<String, ir.Member> _memberMap; |
| 640 Map<String, ir.Member> _setterMap; |
| 640 | 641 |
| 641 KLibraryEnv(this.library); | 642 KLibraryEnv(this.library); |
| 642 | 643 |
| 643 void _ensureClassMap() { | 644 void _ensureClassMap() { |
| 644 if (_classMap == null) { | 645 if (_classMap == null) { |
| 645 _classMap = <String, KClassEnv>{}; | 646 _classMap = <String, KClassEnv>{}; |
| 646 for (ir.Class cls in library.classes) { | 647 for (ir.Class cls in library.classes) { |
| 647 _classMap[cls.name] = new KClassEnv(cls); | 648 _classMap[cls.name] = new KClassEnv(cls); |
| 648 } | 649 } |
| 649 } | 650 } |
| 650 } | 651 } |
| 651 | 652 |
| 652 /// Return the [KClassEnv] for the class [name] in [library]. | 653 /// Return the [KClassEnv] for the class [name] in [library]. |
| 653 KClassEnv lookupClass(String name) { | 654 KClassEnv lookupClass(String name) { |
| 654 _ensureClassMap(); | 655 _ensureClassMap(); |
| 655 return _classMap[name]; | 656 return _classMap[name]; |
| 656 } | 657 } |
| 657 | 658 |
| 658 /// Calls [f] for each class in this library. | 659 /// Calls [f] for each class in this library. |
| 659 void forEachClass(void f(KClassEnv cls)) { | 660 void forEachClass(void f(KClassEnv cls)) { |
| 660 _ensureClassMap(); | 661 _ensureClassMap(); |
| 661 _classMap.values.forEach(f); | 662 _classMap.values.forEach(f); |
| 662 } | 663 } |
| 663 | 664 |
| 664 /// Return the [ir.Member] for the member [name] in [library]. | 665 /// Return the [ir.Member] for the member [name] in [library]. |
| 665 ir.Member lookupMember(String name, {bool setter: false}) { | 666 ir.Member lookupMember(String name, {bool setter: false}) { |
| 666 if (_memberMap == null) { | 667 if (_memberMap == null) { |
| 667 _memberMap = <String, ir.Member>{}; | 668 _memberMap = <String, ir.Member>{}; |
| 669 _setterMap = <String, ir.Member>{}; |
| 668 for (ir.Member member in library.members) { | 670 for (ir.Member member in library.members) { |
| 669 // TODO(johnniwinther): Support setter vs. getter. | 671 if (member is ir.Procedure) { |
| 670 _memberMap[member.name.name] = member; | 672 if (member.kind == ir.ProcedureKind.Setter) { |
| 673 _setterMap[member.name.name] = member; |
| 674 } else { |
| 675 _memberMap[member.name.name] = member; |
| 676 } |
| 677 } else if (member is ir.Field) { |
| 678 _memberMap[member.name.name] = member; |
| 679 if (member.isMutable) { |
| 680 _setterMap[member.name.name] = member; |
| 681 } |
| 682 } else { |
| 683 throw new SpannableAssertionFailure( |
| 684 NO_LOCATION_SPANNABLE, "Unexpected library member node: $member"); |
| 685 } |
| 671 } | 686 } |
| 672 } | 687 } |
| 673 return _memberMap[name]; | 688 return _memberMap[name]; |
| 674 } | 689 } |
| 675 } | 690 } |
| 676 | 691 |
| 677 /// Environment for fast lookup of class members. | 692 /// Environment for fast lookup of class members. |
| 678 // TODO(johnniwinther): Add member lookup. | 693 // TODO(johnniwinther): Add member lookup. |
| 679 class KClassEnv { | 694 class KClassEnv { |
| 680 final ir.Class cls; | 695 final ir.Class cls; |
| 681 | 696 |
| 682 InterfaceType thisType; | 697 InterfaceType thisType; |
| 683 InterfaceType rawType; | 698 InterfaceType rawType; |
| 684 InterfaceType supertype; | 699 InterfaceType supertype; |
| 685 OrderedTypeSet orderedTypeSet; | 700 OrderedTypeSet orderedTypeSet; |
| 686 | 701 |
| 687 Map<String, ir.Member> _constructorMap; | 702 Map<String, ir.Member> _constructorMap; |
| 688 Map<String, ir.Member> _memberMap; | 703 Map<String, ir.Member> _memberMap; |
| 704 Map<String, ir.Member> _setterMap; |
| 689 | 705 |
| 690 Iterable<ConstantExpression> _metadata; | 706 Iterable<ConstantExpression> _metadata; |
| 691 | 707 |
| 692 KClassEnv(this.cls); | 708 KClassEnv(this.cls); |
| 693 | 709 |
| 694 void _ensureMaps() { | 710 void _ensureMaps() { |
| 695 if (_memberMap == null) { | 711 if (_memberMap == null) { |
| 696 _memberMap = <String, ir.Member>{}; | 712 _memberMap = <String, ir.Member>{}; |
| 713 _setterMap = <String, ir.Member>{}; |
| 697 _constructorMap = <String, ir.Member>{}; | 714 _constructorMap = <String, ir.Member>{}; |
| 698 for (ir.Member member in cls.members) { | 715 for (ir.Member member in cls.members) { |
| 699 if (member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) { | 716 if (member is ir.Constructor || |
| 717 member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) { |
| 700 _constructorMap[member.name.name] = member; | 718 _constructorMap[member.name.name] = member; |
| 719 } else if (member is ir.Procedure) { |
| 720 if (member.kind == ir.ProcedureKind.Setter) { |
| 721 _setterMap[member.name.name] = member; |
| 722 } else { |
| 723 _memberMap[member.name.name] = member; |
| 724 } |
| 725 } else if (member is ir.Field) { |
| 726 _memberMap[member.name.name] = member; |
| 727 if (member.isMutable) { |
| 728 _setterMap[member.name.name] = member; |
| 729 } |
| 730 _memberMap[member.name.name] = member; |
| 701 } else { | 731 } else { |
| 702 // TODO(johnniwinther): Support setter vs. getter. | 732 throw new SpannableAssertionFailure( |
| 703 _memberMap[member.name.name] = member; | 733 NO_LOCATION_SPANNABLE, "Unexpected class member node: $member"); |
| 704 } | 734 } |
| 705 } | 735 } |
| 706 for (ir.Member member in cls.constructors) { | |
| 707 _constructorMap[member.name.name] = member; | |
| 708 } | |
| 709 } | 736 } |
| 710 } | 737 } |
| 711 | 738 |
| 712 /// Return the [ir.Member] for the member [name] in [library]. | 739 /// Return the [ir.Member] for the member [name] in [library]. |
| 713 ir.Member lookupMember(String name, {bool setter: false}) { | 740 ir.Member lookupMember(String name, {bool setter: false}) { |
| 714 _ensureMaps(); | 741 _ensureMaps(); |
| 715 return _memberMap[name]; | 742 return setter ? _setterMap[name] : _memberMap[name]; |
| 716 } | 743 } |
| 717 | 744 |
| 718 /// Return the [ir.Member] for the member [name] in [library]. | 745 /// Return the [ir.Member] for the member [name] in [library]. |
| 719 ir.Member lookupConstructor(String name, {bool setter: false}) { | 746 ir.Member lookupConstructor(String name) { |
| 720 _ensureMaps(); | 747 _ensureMaps(); |
| 721 return _constructorMap[name]; | 748 return _constructorMap[name]; |
| 722 } | 749 } |
| 723 | 750 |
| 724 void forEachMember(f(ir.Member member)) { | 751 void forEachMember(f(ir.Member member)) { |
| 725 _ensureMaps(); | 752 _ensureMaps(); |
| 726 _memberMap.values.forEach(f); | 753 _memberMap.values.forEach(f); |
| 727 } | 754 } |
| 728 | 755 |
| 729 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) { | 756 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) { |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1117 } | 1144 } |
| 1118 | 1145 |
| 1119 InterfaceType getMixinTypeForClass(KClass cls) { | 1146 InterfaceType getMixinTypeForClass(KClass cls) { |
| 1120 KClassEnv env = builder._classEnvs[cls.classIndex]; | 1147 KClassEnv env = builder._classEnvs[cls.classIndex]; |
| 1121 ir.Supertype mixedInType = env.cls.mixedInType; | 1148 ir.Supertype mixedInType = env.cls.mixedInType; |
| 1122 if (mixedInType == null) return null; | 1149 if (mixedInType == null) return null; |
| 1123 return builder.createInterfaceType( | 1150 return builder.createInterfaceType( |
| 1124 mixedInType.classNode, mixedInType.typeArguments); | 1151 mixedInType.classNode, mixedInType.typeArguments); |
| 1125 } | 1152 } |
| 1126 } | 1153 } |
| OLD | NEW |