| 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/resolution.dart'; | 10 import '../common/resolution.dart'; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 _KClassEnv classEnv = libraryEnv.lookupClass(name); | 155 _KClassEnv classEnv = libraryEnv.lookupClass(name); |
| 156 if (classEnv != null) { | 156 if (classEnv != null) { |
| 157 return _getClass(classEnv.cls, classEnv); | 157 return _getClass(classEnv.cls, classEnv); |
| 158 } | 158 } |
| 159 return null; | 159 return null; |
| 160 } | 160 } |
| 161 | 161 |
| 162 void _forEachClass(KLibrary library, void f(ClassEntity cls)) { | 162 void _forEachClass(KLibrary library, void f(ClassEntity cls)) { |
| 163 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 163 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 164 libraryEnv.forEachClass((_KClassEnv classEnv) { | 164 libraryEnv.forEachClass((_KClassEnv classEnv) { |
| 165 f(_getClass(classEnv.cls, classEnv)); | 165 if (!classEnv.isUnnamedMixinApplication) { |
| 166 f(_getClass(classEnv.cls, classEnv)); |
| 167 } |
| 166 }); | 168 }); |
| 167 } | 169 } |
| 168 | 170 |
| 169 MemberEntity lookupClassMember(KClass cls, String name, | 171 MemberEntity lookupClassMember(KClass cls, String name, |
| 170 {bool setter: false}) { | 172 {bool setter: false}) { |
| 171 _KClassEnv classEnv = _classEnvs[cls.classIndex]; | 173 _KClassEnv classEnv = _classEnvs[cls.classIndex]; |
| 172 ir.Member member = classEnv.lookupMember(name, setter: setter); | 174 ir.Member member = classEnv.lookupMember(name, setter: setter); |
| 173 return member != null ? getMember(member) : null; | 175 return member != null ? getMember(member) : null; |
| 174 } | 176 } |
| 175 | 177 |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 } | 702 } |
| 701 } | 703 } |
| 702 } | 704 } |
| 703 return _memberMap[name]; | 705 return _memberMap[name]; |
| 704 } | 706 } |
| 705 } | 707 } |
| 706 | 708 |
| 707 /// Environment for fast lookup of class members. | 709 /// Environment for fast lookup of class members. |
| 708 class _KClassEnv { | 710 class _KClassEnv { |
| 709 final ir.Class cls; | 711 final ir.Class cls; |
| 712 final bool isUnnamedMixinApplication; |
| 710 | 713 |
| 711 InterfaceType thisType; | 714 InterfaceType thisType; |
| 712 InterfaceType rawType; | 715 InterfaceType rawType; |
| 713 InterfaceType supertype; | 716 InterfaceType supertype; |
| 714 InterfaceType mixedInType; | 717 InterfaceType mixedInType; |
| 715 OrderedTypeSet orderedTypeSet; | 718 OrderedTypeSet orderedTypeSet; |
| 716 | 719 |
| 717 Map<String, ir.Member> _constructorMap; | 720 Map<String, ir.Member> _constructorMap; |
| 718 Map<String, ir.Member> _memberMap; | 721 Map<String, ir.Member> _memberMap; |
| 719 Map<String, ir.Member> _setterMap; | 722 Map<String, ir.Member> _setterMap; |
| 720 | 723 |
| 721 Iterable<ConstantExpression> _metadata; | 724 Iterable<ConstantExpression> _metadata; |
| 722 | 725 |
| 723 _KClassEnv(this.cls); | 726 _KClassEnv(this.cls) |
| 727 // TODO(johnniwinther): Change this to use a property on [cls] when such |
| 728 // is added to kernel. |
| 729 : isUnnamedMixinApplication = cls.name.contains('+'); |
| 724 | 730 |
| 725 void _ensureMaps() { | 731 void _ensureMaps() { |
| 726 if (_memberMap == null) { | 732 if (_memberMap == null) { |
| 727 _memberMap = <String, ir.Member>{}; | 733 _memberMap = <String, ir.Member>{}; |
| 728 _setterMap = <String, ir.Member>{}; | 734 _setterMap = <String, ir.Member>{}; |
| 729 _constructorMap = <String, ir.Member>{}; | 735 _constructorMap = <String, ir.Member>{}; |
| 730 for (ir.Member member in cls.members) { | 736 |
| 731 if (member is ir.Constructor || | 737 void addMembers(ir.Class c) { |
| 732 member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) { | 738 for (ir.Member member in c.members) { |
| 733 _constructorMap[member.name.name] = member; | 739 if (member is ir.Constructor || |
| 734 } else if (member is ir.Procedure) { | 740 member is ir.Procedure && |
| 735 if (member.kind == ir.ProcedureKind.Setter) { | 741 member.kind == ir.ProcedureKind.Factory) { |
| 736 _setterMap[member.name.name] = member; | 742 _constructorMap[member.name.name] = member; |
| 743 } else if (member is ir.Procedure) { |
| 744 if (member.kind == ir.ProcedureKind.Setter) { |
| 745 _setterMap[member.name.name] = member; |
| 746 } else { |
| 747 _memberMap[member.name.name] = member; |
| 748 } |
| 749 } else if (member is ir.Field) { |
| 750 _memberMap[member.name.name] = member; |
| 751 if (member.isMutable) { |
| 752 _setterMap[member.name.name] = member; |
| 753 } |
| 754 _memberMap[member.name.name] = member; |
| 737 } else { | 755 } else { |
| 738 _memberMap[member.name.name] = member; | 756 throw new SpannableAssertionFailure( |
| 757 NO_LOCATION_SPANNABLE, "Unexpected class member node: $member"); |
| 739 } | 758 } |
| 740 } else if (member is ir.Field) { | |
| 741 _memberMap[member.name.name] = member; | |
| 742 if (member.isMutable) { | |
| 743 _setterMap[member.name.name] = member; | |
| 744 } | |
| 745 _memberMap[member.name.name] = member; | |
| 746 } else { | |
| 747 throw new SpannableAssertionFailure( | |
| 748 NO_LOCATION_SPANNABLE, "Unexpected class member node: $member"); | |
| 749 } | 759 } |
| 750 } | 760 } |
| 761 |
| 762 if (cls.mixedInClass != null) { |
| 763 addMembers(cls.mixedInClass); |
| 764 } |
| 765 addMembers(cls); |
| 751 } | 766 } |
| 752 } | 767 } |
| 753 | 768 |
| 754 /// Return the [ir.Member] for the member [name] in [library]. | 769 /// Return the [ir.Member] for the member [name] in [library]. |
| 755 ir.Member lookupMember(String name, {bool setter: false}) { | 770 ir.Member lookupMember(String name, {bool setter: false}) { |
| 756 _ensureMaps(); | 771 _ensureMaps(); |
| 757 return setter ? _setterMap[name] : _memberMap[name]; | 772 return setter ? _setterMap[name] : _memberMap[name]; |
| 758 } | 773 } |
| 759 | 774 |
| 760 /// Return the [ir.Member] for the member [name] in [library]. | 775 /// Return the [ir.Member] for the member [name] in [library]. |
| (...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1228 @override | 1243 @override |
| 1229 bool checkClass(ClassEntity cls) => true; | 1244 bool checkClass(ClassEntity cls) => true; |
| 1230 } | 1245 } |
| 1231 | 1246 |
| 1232 // Interface for testing equivalence of Kernel-based entities. | 1247 // Interface for testing equivalence of Kernel-based entities. |
| 1233 class WorldDeconstructionForTesting { | 1248 class WorldDeconstructionForTesting { |
| 1234 final KernelToElementMap builder; | 1249 final KernelToElementMap builder; |
| 1235 | 1250 |
| 1236 WorldDeconstructionForTesting(this.builder); | 1251 WorldDeconstructionForTesting(this.builder); |
| 1237 | 1252 |
| 1238 Uri getLibraryUri(KLibrary library) { | |
| 1239 return builder._libraryEnvs[library.libraryIndex].library.importUri; | |
| 1240 } | |
| 1241 | |
| 1242 KLibrary getLibraryForClass(KClass cls) { | |
| 1243 _KClassEnv env = builder._classEnvs[cls.classIndex]; | |
| 1244 return builder.getLibrary(env.cls.enclosingLibrary); | |
| 1245 } | |
| 1246 | |
| 1247 KLibrary _getLibrary<E>(E member, Map<ir.Member, E> map) { | 1253 KLibrary _getLibrary<E>(E member, Map<ir.Member, E> map) { |
| 1248 ir.Library library; | 1254 ir.Library library; |
| 1249 map.forEach((ir.Member node, E other) { | 1255 map.forEach((ir.Member node, E other) { |
| 1250 if (library == null && member == other) { | 1256 if (library == null && member == other) { |
| 1251 library = node.enclosingLibrary; | 1257 library = node.enclosingLibrary; |
| 1252 } | 1258 } |
| 1253 }); | 1259 }); |
| 1254 if (library == null) { | 1260 if (library == null) { |
| 1255 throw new ArgumentError("No library found for $member"); | 1261 throw new ArgumentError("No library found for $member"); |
| 1256 } | 1262 } |
| 1257 return builder._getLibrary(library); | 1263 return builder._getLibrary(library); |
| 1258 } | 1264 } |
| 1259 | 1265 |
| 1260 KLibrary getLibraryForFunction(KFunction function) => | 1266 KLibrary getLibraryForFunction(KFunction function) => |
| 1261 _getLibrary(function, builder._methodMap); | 1267 _getLibrary(function, builder._methodMap); |
| 1262 | 1268 |
| 1263 KLibrary getLibraryForField(KField field) => | 1269 KLibrary getLibraryForField(KField field) => |
| 1264 _getLibrary(field, builder._fieldMap); | 1270 _getLibrary(field, builder._fieldMap); |
| 1265 | 1271 |
| 1266 KClass getSuperclassForClass(KClass cls) { | 1272 KClass getSuperclassForClass(KClass cls) { |
| 1267 _KClassEnv env = builder._classEnvs[cls.classIndex]; | 1273 _KClassEnv env = builder._classEnvs[cls.classIndex]; |
| 1268 ir.Supertype supertype = env.cls.supertype; | 1274 ir.Supertype supertype = env.cls.supertype; |
| 1269 if (supertype == null) return null; | 1275 if (supertype == null) return null; |
| 1270 return builder.getClass(supertype.classNode); | 1276 return builder.getClass(supertype.classNode); |
| 1271 } | 1277 } |
| 1272 | 1278 |
| 1279 bool isUnnamedMixinApplication(KClass cls) { |
| 1280 _KClassEnv env = builder._classEnvs[cls.classIndex]; |
| 1281 return env.isUnnamedMixinApplication; |
| 1282 } |
| 1283 |
| 1273 InterfaceType getMixinTypeForClass(KClass cls) { | 1284 InterfaceType getMixinTypeForClass(KClass cls) { |
| 1274 _KClassEnv env = builder._classEnvs[cls.classIndex]; | 1285 _KClassEnv env = builder._classEnvs[cls.classIndex]; |
| 1275 ir.Supertype mixedInType = env.cls.mixedInType; | 1286 ir.Supertype mixedInType = env.cls.mixedInType; |
| 1276 if (mixedInType == null) return null; | 1287 if (mixedInType == null) return null; |
| 1277 return builder.createInterfaceType( | 1288 return builder.createInterfaceType( |
| 1278 mixedInType.classNode, mixedInType.typeArguments); | 1289 mixedInType.classNode, mixedInType.typeArguments); |
| 1279 } | 1290 } |
| 1280 } | 1291 } |
| OLD | NEW |