| 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 13 matching lines...) Expand all Loading... |
| 24 import '../js_backend/constant_system_javascript.dart'; | 24 import '../js_backend/constant_system_javascript.dart'; |
| 25 import '../js_backend/native_data.dart'; | 25 import '../js_backend/native_data.dart'; |
| 26 import '../js_backend/no_such_method_registry.dart'; | 26 import '../js_backend/no_such_method_registry.dart'; |
| 27 import '../native/native.dart' as native; | 27 import '../native/native.dart' as native; |
| 28 import '../native/resolver.dart'; | 28 import '../native/resolver.dart'; |
| 29 import '../ordered_typeset.dart'; | 29 import '../ordered_typeset.dart'; |
| 30 import '../ssa/kernel_impact.dart'; | 30 import '../ssa/kernel_impact.dart'; |
| 31 import '../universe/call_structure.dart'; | 31 import '../universe/call_structure.dart'; |
| 32 import '../universe/world_builder.dart'; | 32 import '../universe/world_builder.dart'; |
| 33 import '../util/util.dart' show Link, LinkBuilder; | 33 import '../util/util.dart' show Link, LinkBuilder; |
| 34 import 'element_adapter.dart'; | 34 import 'element_map.dart'; |
| 35 import 'elements.dart'; | 35 import 'elements.dart'; |
| 36 | 36 |
| 37 part 'native_basic_data.dart'; | 37 part 'native_basic_data.dart'; |
| 38 part 'no_such_method_resolver.dart'; | 38 part 'no_such_method_resolver.dart'; |
| 39 part 'types.dart'; | 39 part 'types.dart'; |
| 40 | 40 |
| 41 /// Element builder used for creating elements and types corresponding to Kernel | 41 /// Element builder used for creating elements and types corresponding to Kernel |
| 42 /// IR nodes. | 42 /// IR nodes. |
| 43 class KernelToElementMap extends KernelElementAdapterMixin { | 43 class KernelToElementMapImpl extends KernelToElementMapMixin { |
| 44 final Environment _environment; | 44 final Environment _environment; |
| 45 CommonElements _commonElements; | 45 CommonElements _commonElements; |
| 46 native.BehaviorBuilder _nativeBehaviorBuilder; | 46 native.BehaviorBuilder _nativeBehaviorBuilder; |
| 47 final DiagnosticReporter reporter; | 47 final DiagnosticReporter reporter; |
| 48 ElementEnvironment _elementEnvironment; | 48 ElementEnvironment _elementEnvironment; |
| 49 DartTypeConverter _typeConverter; | 49 DartTypeConverter _typeConverter; |
| 50 KernelConstantEnvironment _constantEnvironment; | 50 KernelConstantEnvironment _constantEnvironment; |
| 51 _KernelDartTypes _types; | 51 _KernelDartTypes _types; |
| 52 | 52 |
| 53 /// Library environment. Used for fast lookup. | 53 /// Library environment. Used for fast lookup. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 68 | 68 |
| 69 List<_MemberData> _memberList = <_MemberData>[]; | 69 List<_MemberData> _memberList = <_MemberData>[]; |
| 70 | 70 |
| 71 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; | 71 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; |
| 72 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; | 72 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; |
| 73 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; | 73 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; |
| 74 | 74 |
| 75 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = | 75 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = |
| 76 <ir.TreeNode, KLocalFunction>{}; | 76 <ir.TreeNode, KLocalFunction>{}; |
| 77 | 77 |
| 78 KernelToElementMap(this.reporter, this._environment) { | 78 KernelToElementMapImpl(this.reporter, this._environment) { |
| 79 _elementEnvironment = new KernelElementEnvironment(this); | 79 _elementEnvironment = new KernelElementEnvironment(this); |
| 80 _commonElements = new CommonElements(_elementEnvironment); | 80 _commonElements = new CommonElements(_elementEnvironment); |
| 81 _constantEnvironment = new KernelConstantEnvironment(this); | 81 _constantEnvironment = new KernelConstantEnvironment(this); |
| 82 _nativeBehaviorBuilder = new KernelBehaviorBuilder(_commonElements); | 82 _nativeBehaviorBuilder = new KernelBehaviorBuilder(_commonElements); |
| 83 _types = new _KernelDartTypes(this); | 83 _types = new _KernelDartTypes(this); |
| 84 _typeConverter = new DartTypeConverter(this); | 84 _typeConverter = new DartTypeConverter(this); |
| 85 } | 85 } |
| 86 | 86 |
| 87 /// Adds libraries in [program] to the set of libraries. | 87 /// Adds libraries in [program] to the set of libraries. |
| 88 /// | 88 /// |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 811 _memberMap.values.forEach(f); | 811 _memberMap.values.forEach(f); |
| 812 for (ir.Member member in _setterMap.values) { | 812 for (ir.Member member in _setterMap.values) { |
| 813 if (member is ir.Procedure) { | 813 if (member is ir.Procedure) { |
| 814 f(member); | 814 f(member); |
| 815 } else { | 815 } else { |
| 816 // Skip fields; these are also in _memberMap. | 816 // Skip fields; these are also in _memberMap. |
| 817 } | 817 } |
| 818 } | 818 } |
| 819 } | 819 } |
| 820 | 820 |
| 821 Iterable<ConstantValue> getMetadata(KernelToElementMap elementMap) { | 821 Iterable<ConstantValue> getMetadata(KernelToElementMapImpl elementMap) { |
| 822 return _metadata ??= elementMap.getMetadata(cls.annotations); | 822 return _metadata ??= elementMap.getMetadata(cls.annotations); |
| 823 } | 823 } |
| 824 } | 824 } |
| 825 | 825 |
| 826 class _MemberData { | 826 class _MemberData { |
| 827 final ir.Member node; | 827 final ir.Member node; |
| 828 Iterable<ConstantValue> _metadata; | 828 Iterable<ConstantValue> _metadata; |
| 829 | 829 |
| 830 _MemberData(this.node); | 830 _MemberData(this.node); |
| 831 | 831 |
| 832 ResolutionImpact getWorldImpact(KernelToElementMap elementMap) { | 832 ResolutionImpact getWorldImpact(KernelToElementMapImpl elementMap) { |
| 833 return buildKernelImpact(node, elementMap); | 833 return buildKernelImpact(node, elementMap); |
| 834 } | 834 } |
| 835 | 835 |
| 836 Iterable<ConstantValue> getMetadata(KernelToElementMap elementMap) { | 836 Iterable<ConstantValue> getMetadata(KernelToElementMapImpl elementMap) { |
| 837 return _metadata ??= elementMap.getMetadata(node.annotations); | 837 return _metadata ??= elementMap.getMetadata(node.annotations); |
| 838 } | 838 } |
| 839 } | 839 } |
| 840 | 840 |
| 841 class _FunctionData extends _MemberData { | 841 class _FunctionData extends _MemberData { |
| 842 final ir.FunctionNode functionNode; | 842 final ir.FunctionNode functionNode; |
| 843 FunctionType _type; | 843 FunctionType _type; |
| 844 CallStructure _callStructure; | 844 CallStructure _callStructure; |
| 845 | 845 |
| 846 _FunctionData(ir.Member node, this.functionNode) : super(node); | 846 _FunctionData(ir.Member node, this.functionNode) : super(node); |
| 847 | 847 |
| 848 FunctionType getFunctionType(KernelToElementMap elementMap) { | 848 FunctionType getFunctionType(KernelToElementMapImpl elementMap) { |
| 849 return _type ??= elementMap.getFunctionType(functionNode); | 849 return _type ??= elementMap.getFunctionType(functionNode); |
| 850 } | 850 } |
| 851 | 851 |
| 852 CallStructure get callStructure { | 852 CallStructure get callStructure { |
| 853 return _callStructure ??= new CallStructure( | 853 return _callStructure ??= new CallStructure( |
| 854 functionNode.positionalParameters.length + | 854 functionNode.positionalParameters.length + |
| 855 functionNode.namedParameters.length, | 855 functionNode.namedParameters.length, |
| 856 functionNode.namedParameters.map((d) => d.name).toList()); | 856 functionNode.namedParameters.map((d) => d.name).toList()); |
| 857 } | 857 } |
| 858 } | 858 } |
| 859 | 859 |
| 860 class _ConstructorData extends _FunctionData { | 860 class _ConstructorData extends _FunctionData { |
| 861 ConstantConstructor _constantConstructor; | 861 ConstantConstructor _constantConstructor; |
| 862 | 862 |
| 863 _ConstructorData(ir.Member node, ir.FunctionNode functionNode) | 863 _ConstructorData(ir.Member node, ir.FunctionNode functionNode) |
| 864 : super(node, functionNode); | 864 : super(node, functionNode); |
| 865 | 865 |
| 866 ConstantConstructor getConstructorConstant( | 866 ConstantConstructor getConstructorConstant( |
| 867 KernelToElementMap elementMap, KConstructor constructor) { | 867 KernelToElementMapImpl elementMap, KConstructor constructor) { |
| 868 if (_constantConstructor == null) { | 868 if (_constantConstructor == null) { |
| 869 if (node is ir.Constructor && constructor.isConst) { | 869 if (node is ir.Constructor && constructor.isConst) { |
| 870 _constantConstructor = | 870 _constantConstructor = |
| 871 new Constantifier(elementMap).computeConstantConstructor(node); | 871 new Constantifier(elementMap).computeConstantConstructor(node); |
| 872 } else { | 872 } else { |
| 873 throw new SpannableAssertionFailure( | 873 throw new SpannableAssertionFailure( |
| 874 constructor, | 874 constructor, |
| 875 "Unexpected constructor $constructor in " | 875 "Unexpected constructor $constructor in " |
| 876 "KernelWorldBuilder._getConstructorConstant"); | 876 "KernelWorldBuilder._getConstructorConstant"); |
| 877 } | 877 } |
| 878 } | 878 } |
| 879 return _constantConstructor; | 879 return _constantConstructor; |
| 880 } | 880 } |
| 881 } | 881 } |
| 882 | 882 |
| 883 class _FieldData extends _MemberData { | 883 class _FieldData extends _MemberData { |
| 884 ConstantExpression _constant; | 884 ConstantExpression _constant; |
| 885 | 885 |
| 886 _FieldData(ir.Field node) : super(node); | 886 _FieldData(ir.Field node) : super(node); |
| 887 | 887 |
| 888 ir.Field get node => super.node; | 888 ir.Field get node => super.node; |
| 889 | 889 |
| 890 ConstantExpression getFieldConstant( | 890 ConstantExpression getFieldConstant( |
| 891 KernelToElementMap elementMap, KField field) { | 891 KernelToElementMapImpl elementMap, KField field) { |
| 892 if (_constant == null) { | 892 if (_constant == null) { |
| 893 if (node.isConst) { | 893 if (node.isConst) { |
| 894 _constant = new Constantifier(elementMap).visit(node.initializer); | 894 _constant = new Constantifier(elementMap).visit(node.initializer); |
| 895 } else { | 895 } else { |
| 896 throw new SpannableAssertionFailure( | 896 throw new SpannableAssertionFailure( |
| 897 field, | 897 field, |
| 898 "Unexpected field $field in " | 898 "Unexpected field $field in " |
| 899 "KernelWorldBuilder._getConstructorConstant"); | 899 "KernelWorldBuilder._getConstructorConstant"); |
| 900 } | 900 } |
| 901 } | 901 } |
| 902 return _constant; | 902 return _constant; |
| 903 } | 903 } |
| 904 } | 904 } |
| 905 | 905 |
| 906 class KernelElementEnvironment implements ElementEnvironment { | 906 class KernelElementEnvironment implements ElementEnvironment { |
| 907 final KernelToElementMap elementMap; | 907 final KernelToElementMapImpl elementMap; |
| 908 | 908 |
| 909 KernelElementEnvironment(this.elementMap); | 909 KernelElementEnvironment(this.elementMap); |
| 910 | 910 |
| 911 @override | 911 @override |
| 912 DartType get dynamicType => const DynamicType(); | 912 DartType get dynamicType => const DynamicType(); |
| 913 | 913 |
| 914 @override | 914 @override |
| 915 LibraryEntity get mainLibrary => elementMap._mainLibrary; | 915 LibraryEntity get mainLibrary => elementMap._mainLibrary; |
| 916 | 916 |
| 917 @override | 917 @override |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1071 | 1071 |
| 1072 @override | 1072 @override |
| 1073 Iterable<ConstantValue> getMemberMetadata(KMember member) { | 1073 Iterable<ConstantValue> getMemberMetadata(KMember member) { |
| 1074 _MemberData memberData = elementMap._memberList[member.memberIndex]; | 1074 _MemberData memberData = elementMap._memberList[member.memberIndex]; |
| 1075 return memberData.getMetadata(elementMap); | 1075 return memberData.getMetadata(elementMap); |
| 1076 } | 1076 } |
| 1077 } | 1077 } |
| 1078 | 1078 |
| 1079 /// Visitor that converts kernel dart types into [DartType]. | 1079 /// Visitor that converts kernel dart types into [DartType]. |
| 1080 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { | 1080 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { |
| 1081 final KernelToElementMap elementAdapter; | 1081 final KernelToElementMapImpl elementAdapter; |
| 1082 bool topLevel = true; | 1082 bool topLevel = true; |
| 1083 | 1083 |
| 1084 DartTypeConverter(this.elementAdapter); | 1084 DartTypeConverter(this.elementAdapter); |
| 1085 | 1085 |
| 1086 DartType convert(ir.DartType type) { | 1086 DartType convert(ir.DartType type) { |
| 1087 topLevel = true; | 1087 topLevel = true; |
| 1088 return type.accept(this); | 1088 return type.accept(this); |
| 1089 } | 1089 } |
| 1090 | 1090 |
| 1091 /// Visit a inner type. | 1091 /// Visit a inner type. |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 | 1170 |
| 1171 @override | 1171 @override |
| 1172 NativeData get nativeData { | 1172 NativeData get nativeData { |
| 1173 throw new UnimplementedError("KernelNativeBehaviorComputer.nativeData"); | 1173 throw new UnimplementedError("KernelNativeBehaviorComputer.nativeData"); |
| 1174 } | 1174 } |
| 1175 } | 1175 } |
| 1176 | 1176 |
| 1177 /// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using | 1177 /// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using |
| 1178 /// [_EvaluationEnvironment] for the evaluation. | 1178 /// [_EvaluationEnvironment] for the evaluation. |
| 1179 class KernelConstantEnvironment implements ConstantEnvironment { | 1179 class KernelConstantEnvironment implements ConstantEnvironment { |
| 1180 KernelToElementMap _worldBuilder; | 1180 KernelToElementMapImpl _worldBuilder; |
| 1181 Map<ConstantExpression, ConstantValue> _valueMap = | 1181 Map<ConstantExpression, ConstantValue> _valueMap = |
| 1182 <ConstantExpression, ConstantValue>{}; | 1182 <ConstantExpression, ConstantValue>{}; |
| 1183 | 1183 |
| 1184 KernelConstantEnvironment(this._worldBuilder); | 1184 KernelConstantEnvironment(this._worldBuilder); |
| 1185 | 1185 |
| 1186 @override | 1186 @override |
| 1187 ConstantSystem get constantSystem => const JavaScriptConstantSystem(); | 1187 ConstantSystem get constantSystem => const JavaScriptConstantSystem(); |
| 1188 | 1188 |
| 1189 @override | 1189 @override |
| 1190 ConstantValue getConstantValueForVariable(VariableElement element) { | 1190 ConstantValue getConstantValueForVariable(VariableElement element) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1202 | 1202 |
| 1203 @override | 1203 @override |
| 1204 bool hasConstantValue(ConstantExpression expression) { | 1204 bool hasConstantValue(ConstantExpression expression) { |
| 1205 throw new UnimplementedError("KernelConstantEnvironment.hasConstantValue"); | 1205 throw new UnimplementedError("KernelConstantEnvironment.hasConstantValue"); |
| 1206 } | 1206 } |
| 1207 } | 1207 } |
| 1208 | 1208 |
| 1209 /// Evaluation environment used for computing [ConstantValue]s for | 1209 /// Evaluation environment used for computing [ConstantValue]s for |
| 1210 /// kernel based [ConstantExpression]s. | 1210 /// kernel based [ConstantExpression]s. |
| 1211 class _EvaluationEnvironment implements EvaluationEnvironment { | 1211 class _EvaluationEnvironment implements EvaluationEnvironment { |
| 1212 final KernelToElementMap _elementMap; | 1212 final KernelToElementMapImpl _elementMap; |
| 1213 | 1213 |
| 1214 _EvaluationEnvironment(this._elementMap); | 1214 _EvaluationEnvironment(this._elementMap); |
| 1215 | 1215 |
| 1216 @override | 1216 @override |
| 1217 CommonElements get commonElements => _elementMap.commonElements; | 1217 CommonElements get commonElements => _elementMap.commonElements; |
| 1218 | 1218 |
| 1219 @override | 1219 @override |
| 1220 InterfaceType substByContext(InterfaceType base, InterfaceType target) { | 1220 InterfaceType substByContext(InterfaceType base, InterfaceType target) { |
| 1221 return _elementMap._substByContext(base, target); | 1221 return _elementMap._substByContext(base, target); |
| 1222 } | 1222 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1236 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant"); | 1236 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant"); |
| 1237 } | 1237 } |
| 1238 | 1238 |
| 1239 @override | 1239 @override |
| 1240 String readFromEnvironment(String name) { | 1240 String readFromEnvironment(String name) { |
| 1241 return _elementMap._environment.valueOf(name); | 1241 return _elementMap._environment.valueOf(name); |
| 1242 } | 1242 } |
| 1243 } | 1243 } |
| 1244 | 1244 |
| 1245 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { | 1245 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { |
| 1246 final KernelToElementMap elementMap; | 1246 final KernelToElementMapImpl elementMap; |
| 1247 | 1247 |
| 1248 KernelResolutionWorldBuilder(this.elementMap, NativeBasicData nativeBasicData, | 1248 KernelResolutionWorldBuilder(this.elementMap, NativeBasicData nativeBasicData, |
| 1249 SelectorConstraintsStrategy selectorConstraintsStrategy) | 1249 SelectorConstraintsStrategy selectorConstraintsStrategy) |
| 1250 : super(elementMap.elementEnvironment, elementMap.commonElements, | 1250 : super(elementMap.elementEnvironment, elementMap.commonElements, |
| 1251 nativeBasicData, selectorConstraintsStrategy); | 1251 nativeBasicData, selectorConstraintsStrategy); |
| 1252 | 1252 |
| 1253 @override | 1253 @override |
| 1254 Iterable<InterfaceType> getSupertypes(ClassEntity cls) { | 1254 Iterable<InterfaceType> getSupertypes(ClassEntity cls) { |
| 1255 return elementMap._getOrderedTypeSet(cls).supertypes; | 1255 return elementMap._getOrderedTypeSet(cls).supertypes; |
| 1256 } | 1256 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1279 | 1279 |
| 1280 @override | 1280 @override |
| 1281 bool validateClass(ClassEntity cls) => true; | 1281 bool validateClass(ClassEntity cls) => true; |
| 1282 | 1282 |
| 1283 @override | 1283 @override |
| 1284 bool checkClass(ClassEntity cls) => true; | 1284 bool checkClass(ClassEntity cls) => true; |
| 1285 } | 1285 } |
| 1286 | 1286 |
| 1287 // Interface for testing equivalence of Kernel-based entities. | 1287 // Interface for testing equivalence of Kernel-based entities. |
| 1288 class WorldDeconstructionForTesting { | 1288 class WorldDeconstructionForTesting { |
| 1289 final KernelToElementMap elementMap; | 1289 final KernelToElementMapImpl elementMap; |
| 1290 | 1290 |
| 1291 WorldDeconstructionForTesting(this.elementMap); | 1291 WorldDeconstructionForTesting(this.elementMap); |
| 1292 | 1292 |
| 1293 KClass getSuperclassForClass(KClass cls) { | 1293 KClass getSuperclassForClass(KClass cls) { |
| 1294 _KClassEnv env = elementMap._classEnvs[cls.classIndex]; | 1294 _KClassEnv env = elementMap._classEnvs[cls.classIndex]; |
| 1295 ir.Supertype supertype = env.cls.supertype; | 1295 ir.Supertype supertype = env.cls.supertype; |
| 1296 if (supertype == null) return null; | 1296 if (supertype == null) return null; |
| 1297 return elementMap.getClass(supertype.classNode); | 1297 return elementMap.getClass(supertype.classNode); |
| 1298 } | 1298 } |
| 1299 | 1299 |
| 1300 bool isUnnamedMixinApplication(KClass cls) { | 1300 bool isUnnamedMixinApplication(KClass cls) { |
| 1301 return elementMap._isUnnamedMixinApplication(cls); | 1301 return elementMap._isUnnamedMixinApplication(cls); |
| 1302 } | 1302 } |
| 1303 | 1303 |
| 1304 InterfaceType getMixinTypeForClass(KClass cls) { | 1304 InterfaceType getMixinTypeForClass(KClass cls) { |
| 1305 _KClassEnv env = elementMap._classEnvs[cls.classIndex]; | 1305 _KClassEnv env = elementMap._classEnvs[cls.classIndex]; |
| 1306 ir.Supertype mixedInType = env.cls.mixedInType; | 1306 ir.Supertype mixedInType = env.cls.mixedInType; |
| 1307 if (mixedInType == null) return null; | 1307 if (mixedInType == null) return null; |
| 1308 return elementMap.createInterfaceType( | 1308 return elementMap.createInterfaceType( |
| 1309 mixedInType.classNode, mixedInType.typeArguments); | 1309 mixedInType.classNode, mixedInType.typeArguments); |
| 1310 } | 1310 } |
| 1311 } | 1311 } |
| OLD | NEW |