| 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 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 }); | 152 }); |
| 153 } | 153 } |
| 154 | 154 |
| 155 MemberEntity lookupLibraryMember(KLibrary library, String name, | 155 MemberEntity lookupLibraryMember(KLibrary library, String name, |
| 156 {bool setter: false}) { | 156 {bool setter: false}) { |
| 157 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 157 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 158 ir.Member member = libraryEnv.lookupMember(name, setter: setter); | 158 ir.Member member = libraryEnv.lookupMember(name, setter: setter); |
| 159 return member != null ? getMember(member) : null; | 159 return member != null ? getMember(member) : null; |
| 160 } | 160 } |
| 161 | 161 |
| 162 void _forEachLibraryMember(KLibrary library, void f(MemberEntity member)) { |
| 163 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 164 libraryEnv.forEachMember((ir.Member node) { |
| 165 f(getMember(node)); |
| 166 }); |
| 167 } |
| 168 |
| 162 ClassEntity lookupClass(KLibrary library, String name) { | 169 ClassEntity lookupClass(KLibrary library, String name) { |
| 163 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 170 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 164 _KClassEnv classEnv = libraryEnv.lookupClass(name); | 171 _KClassEnv classEnv = libraryEnv.lookupClass(name); |
| 165 if (classEnv != null) { | 172 if (classEnv != null) { |
| 166 return _getClass(classEnv.cls, classEnv); | 173 return _getClass(classEnv.cls, classEnv); |
| 167 } | 174 } |
| 168 return null; | 175 return null; |
| 169 } | 176 } |
| 170 | 177 |
| 171 void _forEachClass(KLibrary library, void f(ClassEntity cls)) { | 178 void _forEachClass(KLibrary library, void f(ClassEntity cls)) { |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 while (cls != null) { | 530 while (cls != null) { |
| 524 _KClassEnv env = _classEnvs[cls.classIndex]; | 531 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 525 _ensureSupertypes(cls, env); | 532 _ensureSupertypes(cls, env); |
| 526 if (env.mixedInType != null) { | 533 if (env.mixedInType != null) { |
| 527 f(env.mixedInType.element); | 534 f(env.mixedInType.element); |
| 528 } | 535 } |
| 529 cls = env.supertype?.element; | 536 cls = env.supertype?.element; |
| 530 } | 537 } |
| 531 } | 538 } |
| 532 | 539 |
| 540 void _forEachConstructor(KClass cls, void f(ConstructorEntity member)) { |
| 541 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 542 env.forEachConstructor((ir.Member member) { |
| 543 f(getConstructor(member)); |
| 544 }); |
| 545 } |
| 546 |
| 533 void _forEachClassMember( | 547 void _forEachClassMember( |
| 534 KClass cls, void f(ClassEntity cls, MemberEntity member)) { | 548 KClass cls, void f(ClassEntity cls, MemberEntity member)) { |
| 535 _KClassEnv env = _classEnvs[cls.classIndex]; | 549 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 536 env.forEachMember((ir.Member member) { | 550 env.forEachMember((ir.Member member) { |
| 537 f(cls, getMember(member)); | 551 f(cls, getMember(member)); |
| 538 }); | 552 }); |
| 539 _ensureSupertypes(cls, env); | 553 _ensureSupertypes(cls, env); |
| 540 if (env.supertype != null) { | 554 if (env.supertype != null) { |
| 541 _forEachClassMember(env.supertype.element, f); | 555 _forEachClassMember(env.supertype.element, f); |
| 542 } | 556 } |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 _ensureClassMap(); | 716 _ensureClassMap(); |
| 703 return _classMap[name]; | 717 return _classMap[name]; |
| 704 } | 718 } |
| 705 | 719 |
| 706 /// Calls [f] for each class in this library. | 720 /// Calls [f] for each class in this library. |
| 707 void forEachClass(void f(_KClassEnv cls)) { | 721 void forEachClass(void f(_KClassEnv cls)) { |
| 708 _ensureClassMap(); | 722 _ensureClassMap(); |
| 709 _classMap.values.forEach(f); | 723 _classMap.values.forEach(f); |
| 710 } | 724 } |
| 711 | 725 |
| 712 /// Return the [ir.Member] for the member [name] in [library]. | 726 void _ensureMemberMaps() { |
| 713 ir.Member lookupMember(String name, {bool setter: false}) { | |
| 714 if (_memberMap == null) { | 727 if (_memberMap == null) { |
| 715 _memberMap = <String, ir.Member>{}; | 728 _memberMap = <String, ir.Member>{}; |
| 716 _setterMap = <String, ir.Member>{}; | 729 _setterMap = <String, ir.Member>{}; |
| 717 for (ir.Member member in library.members) { | 730 for (ir.Member member in library.members) { |
| 718 if (member is ir.Procedure) { | 731 if (member is ir.Procedure) { |
| 719 if (member.kind == ir.ProcedureKind.Setter) { | 732 if (member.kind == ir.ProcedureKind.Setter) { |
| 720 _setterMap[member.name.name] = member; | 733 _setterMap[member.name.name] = member; |
| 721 } else { | 734 } else { |
| 722 _memberMap[member.name.name] = member; | 735 _memberMap[member.name.name] = member; |
| 723 } | 736 } |
| 724 } else if (member is ir.Field) { | 737 } else if (member is ir.Field) { |
| 725 _memberMap[member.name.name] = member; | 738 _memberMap[member.name.name] = member; |
| 726 if (member.isMutable) { | 739 if (member.isMutable) { |
| 727 _setterMap[member.name.name] = member; | 740 _setterMap[member.name.name] = member; |
| 728 } | 741 } |
| 729 } else { | 742 } else { |
| 730 throw new SpannableAssertionFailure( | 743 throw new SpannableAssertionFailure( |
| 731 NO_LOCATION_SPANNABLE, "Unexpected library member node: $member"); | 744 NO_LOCATION_SPANNABLE, "Unexpected library member node: $member"); |
| 732 } | 745 } |
| 733 } | 746 } |
| 734 } | 747 } |
| 735 return _memberMap[name]; | 748 } |
| 749 |
| 750 /// Return the [ir.Member] for the member [name] in [library]. |
| 751 ir.Member lookupMember(String name, {bool setter: false}) { |
| 752 _ensureMemberMaps(); |
| 753 return setter ? _setterMap[name] : _memberMap[name]; |
| 754 } |
| 755 |
| 756 void forEachMember(void f(ir.Member member)) { |
| 757 _ensureMemberMaps(); |
| 758 _memberMap.values.forEach(f); |
| 759 for (ir.Member member in _setterMap.values) { |
| 760 if (member is ir.Procedure) { |
| 761 f(member); |
| 762 } else { |
| 763 // Skip fields; these are also in _memberMap. |
| 764 } |
| 765 } |
| 736 } | 766 } |
| 737 } | 767 } |
| 738 | 768 |
| 739 /// Environment for fast lookup of class members. | 769 /// Environment for fast lookup of class members. |
| 740 class _KClassEnv { | 770 class _KClassEnv { |
| 741 final ir.Class cls; | 771 final ir.Class cls; |
| 742 final bool isUnnamedMixinApplication; | 772 final bool isUnnamedMixinApplication; |
| 743 | 773 |
| 744 InterfaceType thisType; | 774 InterfaceType thisType; |
| 745 InterfaceType rawType; | 775 InterfaceType rawType; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 _ensureMaps(); | 834 _ensureMaps(); |
| 805 return setter ? _setterMap[name] : _memberMap[name]; | 835 return setter ? _setterMap[name] : _memberMap[name]; |
| 806 } | 836 } |
| 807 | 837 |
| 808 /// Return the [ir.Member] for the member [name] in [library]. | 838 /// Return the [ir.Member] for the member [name] in [library]. |
| 809 ir.Member lookupConstructor(String name) { | 839 ir.Member lookupConstructor(String name) { |
| 810 _ensureMaps(); | 840 _ensureMaps(); |
| 811 return _constructorMap[name]; | 841 return _constructorMap[name]; |
| 812 } | 842 } |
| 813 | 843 |
| 814 void forEachMember(f(ir.Member member)) { | 844 void forEachMember(void f(ir.Member member)) { |
| 815 _ensureMaps(); | 845 _ensureMaps(); |
| 816 _memberMap.values.forEach(f); | 846 _memberMap.values.forEach(f); |
| 817 for (ir.Member member in _setterMap.values) { | 847 for (ir.Member member in _setterMap.values) { |
| 818 if (member is ir.Procedure) { | 848 if (member is ir.Procedure) { |
| 819 f(member); | 849 f(member); |
| 820 } else { | 850 } else { |
| 821 // Skip fields; these are also in _memberMap. | 851 // Skip fields; these are also in _memberMap. |
| 822 } | 852 } |
| 823 } | 853 } |
| 824 } | 854 } |
| 825 | 855 |
| 856 void forEachConstructor(void f(ir.Member member)) { |
| 857 _ensureMaps(); |
| 858 _constructorMap.values.forEach(f); |
| 859 } |
| 860 |
| 826 Iterable<ConstantValue> getMetadata(KernelToElementMapImpl elementMap) { | 861 Iterable<ConstantValue> getMetadata(KernelToElementMapImpl elementMap) { |
| 827 return _metadata ??= elementMap.getMetadata(cls.annotations); | 862 return _metadata ??= elementMap.getMetadata(cls.annotations); |
| 828 } | 863 } |
| 829 } | 864 } |
| 830 | 865 |
| 831 class _MemberData { | 866 class _MemberData { |
| 832 final ir.Member node; | 867 final ir.Member node; |
| 833 Iterable<ConstantValue> _metadata; | 868 Iterable<ConstantValue> _metadata; |
| 834 | 869 |
| 835 _MemberData(this.node); | 870 _MemberData(this.node); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 elementMap._forEachMixin(cls, f); | 1048 elementMap._forEachMixin(cls, f); |
| 1014 } | 1049 } |
| 1015 | 1050 |
| 1016 @override | 1051 @override |
| 1017 void forEachClassMember( | 1052 void forEachClassMember( |
| 1018 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { | 1053 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { |
| 1019 elementMap._forEachClassMember(cls, f); | 1054 elementMap._forEachClassMember(cls, f); |
| 1020 } | 1055 } |
| 1021 | 1056 |
| 1022 @override | 1057 @override |
| 1058 void forEachConstructor( |
| 1059 ClassEntity cls, void f(ConstructorEntity constructor)) { |
| 1060 elementMap._forEachConstructor(cls, f); |
| 1061 } |
| 1062 |
| 1063 @override |
| 1064 void forEachLibraryMember( |
| 1065 LibraryEntity library, void f(MemberEntity member)) { |
| 1066 elementMap._forEachLibraryMember(library, f); |
| 1067 } |
| 1068 |
| 1069 @override |
| 1023 MemberEntity lookupLibraryMember(LibraryEntity library, String name, | 1070 MemberEntity lookupLibraryMember(LibraryEntity library, String name, |
| 1024 {bool setter: false, bool required: false}) { | 1071 {bool setter: false, bool required: false}) { |
| 1025 MemberEntity member = | 1072 MemberEntity member = |
| 1026 elementMap.lookupLibraryMember(library, name, setter: setter); | 1073 elementMap.lookupLibraryMember(library, name, setter: setter); |
| 1027 if (member == null && required) { | 1074 if (member == null && required) { |
| 1028 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 1075 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, |
| 1029 "The member '${name}' was not found in library '${library.name}'."); | 1076 "The member '${name}' was not found in library '${library.name}'."); |
| 1030 } | 1077 } |
| 1031 return member; | 1078 return member; |
| 1032 } | 1079 } |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1361 return node.isExternal && | 1408 return node.isExternal && |
| 1362 !elementMap.isForeignLibrary(node.enclosingLibrary); | 1409 !elementMap.isForeignLibrary(node.enclosingLibrary); |
| 1363 } | 1410 } |
| 1364 | 1411 |
| 1365 @override | 1412 @override |
| 1366 bool isJsInteropMember(MemberEntity element) { | 1413 bool isJsInteropMember(MemberEntity element) { |
| 1367 // TODO(johnniwinther): Compute this. | 1414 // TODO(johnniwinther): Compute this. |
| 1368 return false; | 1415 return false; |
| 1369 } | 1416 } |
| 1370 } | 1417 } |
| OLD | NEW |