Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(436)

Side by Side Diff: pkg/compiler/lib/src/kernel/element_map.dart

Issue 2845093003: Handle mixed in members (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tests/compiler/dart2js/kernel/closed_world2_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | tests/compiler/dart2js/kernel/closed_world2_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698