| 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 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 FunctionEntity getMethod(ir.Procedure node) => _getMethod(node); | 391 FunctionEntity getMethod(ir.Procedure node) => _getMethod(node); |
| 392 | 392 |
| 393 FunctionEntity _getMethod(ir.Procedure node); | 393 FunctionEntity _getMethod(ir.Procedure node); |
| 394 | 394 |
| 395 @override | 395 @override |
| 396 FieldEntity getField(ir.Field node) => _getField(node); | 396 FieldEntity getField(ir.Field node) => _getField(node); |
| 397 | 397 |
| 398 FieldEntity _getField(ir.Field node); | 398 FieldEntity _getField(ir.Field node); |
| 399 | 399 |
| 400 @override | 400 @override |
| 401 Local getLocalFunction(ir.TreeNode node) => _getLocalFunction(node); | |
| 402 | |
| 403 Local _getLocalFunction(ir.TreeNode node); | |
| 404 | |
| 405 @override | |
| 406 DartType getDartType(ir.DartType type) => _typeConverter.convert(type); | 401 DartType getDartType(ir.DartType type) => _typeConverter.convert(type); |
| 407 | 402 |
| 408 List<DartType> getDartTypes(List<ir.DartType> types) { | 403 List<DartType> getDartTypes(List<ir.DartType> types) { |
| 409 // TODO(johnniwinther): Add the type argument to the list literal when we | 404 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 410 // no longer use resolution types. | 405 // no longer use resolution types. |
| 411 List<DartType> list = /*<DartType>*/ []; | 406 List<DartType> list = /*<DartType>*/ []; |
| 412 types.forEach((ir.DartType type) { | 407 types.forEach((ir.DartType type) { |
| 413 list.add(getDartType(type)); | 408 list.add(getDartType(type)); |
| 414 }); | 409 }); |
| 415 return list; | 410 return list; |
| (...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 ParameterStructure _getParameterStructure(ir.FunctionNode node) { | 883 ParameterStructure _getParameterStructure(ir.FunctionNode node) { |
| 889 // TODO(johnniwinther): Cache the computed function type. | 884 // TODO(johnniwinther): Cache the computed function type. |
| 890 int requiredParameters = node.requiredParameterCount; | 885 int requiredParameters = node.requiredParameterCount; |
| 891 int positionalParameters = node.positionalParameters.length; | 886 int positionalParameters = node.positionalParameters.length; |
| 892 List<String> namedParameters = | 887 List<String> namedParameters = |
| 893 node.namedParameters.map((p) => p.name).toList()..sort(); | 888 node.namedParameters.map((p) => p.name).toList()..sort(); |
| 894 return new ParameterStructure( | 889 return new ParameterStructure( |
| 895 requiredParameters, positionalParameters, namedParameters); | 890 requiredParameters, positionalParameters, namedParameters); |
| 896 } | 891 } |
| 897 | 892 |
| 898 Local _getLocalFunction(ir.TreeNode node) { | |
| 899 assert( | |
| 900 node is ir.FunctionDeclaration || node is ir.FunctionExpression, | |
| 901 failedAt( | |
| 902 CURRENT_ELEMENT_SPANNABLE, 'Invalid local function node: $node')); | |
| 903 return _localFunctionMap.putIfAbsent(node, () { | |
| 904 MemberEntity memberContext; | |
| 905 Entity executableContext; | |
| 906 ir.TreeNode parent = node.parent; | |
| 907 while (parent != null) { | |
| 908 if (parent is ir.Member) { | |
| 909 executableContext = memberContext = getMember(parent); | |
| 910 break; | |
| 911 } | |
| 912 if (parent is ir.FunctionDeclaration || | |
| 913 parent is ir.FunctionExpression) { | |
| 914 Local localFunction = _getLocalFunction(parent); | |
| 915 executableContext = localFunction; | |
| 916 memberContext = localFunction.memberContext; | |
| 917 break; | |
| 918 } | |
| 919 parent = parent.parent; | |
| 920 } | |
| 921 String name; | |
| 922 FunctionType functionType; | |
| 923 if (node is ir.FunctionDeclaration) { | |
| 924 name = node.variable.name; | |
| 925 functionType = getFunctionType(node.function); | |
| 926 } else if (node is ir.FunctionExpression) { | |
| 927 functionType = getFunctionType(node.function); | |
| 928 } | |
| 929 return createLocalFunction( | |
| 930 name, memberContext, executableContext, functionType); | |
| 931 }); | |
| 932 } | |
| 933 | |
| 934 IndexedLibrary createLibrary(int libraryIndex, String name, Uri canonicalUri); | 893 IndexedLibrary createLibrary(int libraryIndex, String name, Uri canonicalUri); |
| 935 | 894 |
| 936 IndexedClass createClass(LibraryEntity library, int classIndex, String name, | 895 IndexedClass createClass(LibraryEntity library, int classIndex, String name, |
| 937 {bool isAbstract}); | 896 {bool isAbstract}); |
| 938 | 897 |
| 939 TypeVariableEntity createTypeVariable( | 898 TypeVariableEntity createTypeVariable( |
| 940 int typeVariableIndex, Entity typeDeclaration, String name, int index); | 899 int typeVariableIndex, Entity typeDeclaration, String name, int index); |
| 941 | 900 |
| 942 IndexedConstructor createGenerativeConstructor( | 901 IndexedConstructor createGenerativeConstructor( |
| 943 int memberIndex, | 902 int memberIndex, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 971 bool isExternal, | 930 bool isExternal, |
| 972 bool isAbstract}); | 931 bool isAbstract}); |
| 973 | 932 |
| 974 IndexedFunction createSetter(int memberIndex, LibraryEntity library, | 933 IndexedFunction createSetter(int memberIndex, LibraryEntity library, |
| 975 ClassEntity enclosingClass, Name name, | 934 ClassEntity enclosingClass, Name name, |
| 976 {bool isStatic, bool isExternal, bool isAbstract}); | 935 {bool isStatic, bool isExternal, bool isAbstract}); |
| 977 | 936 |
| 978 IndexedField createField(int memberIndex, LibraryEntity library, | 937 IndexedField createField(int memberIndex, LibraryEntity library, |
| 979 ClassEntity enclosingClass, Name name, | 938 ClassEntity enclosingClass, Name name, |
| 980 {bool isStatic, bool isAssignable, bool isConst}); | 939 {bool isStatic, bool isAssignable, bool isConst}); |
| 981 | |
| 982 Local createLocalFunction(String name, MemberEntity memberContext, | |
| 983 Entity executableContext, FunctionType functionType); | |
| 984 } | 940 } |
| 985 | 941 |
| 986 /// Completes the [ElementCreatorMixin] by creating K-model elements. | 942 /// Completes the [ElementCreatorMixin] by creating K-model elements. |
| 987 abstract class KElementCreatorMixin implements ElementCreatorMixin { | 943 abstract class KElementCreatorMixin implements ElementCreatorMixin { |
| 988 IndexedLibrary createLibrary( | 944 IndexedLibrary createLibrary( |
| 989 int libraryIndex, String name, Uri canonicalUri) { | 945 int libraryIndex, String name, Uri canonicalUri) { |
| 990 return new KLibrary(libraryIndex, name, canonicalUri); | 946 return new KLibrary(libraryIndex, name, canonicalUri); |
| 991 } | 947 } |
| 992 | 948 |
| 993 IndexedClass createClass(LibraryEntity library, int classIndex, String name, | 949 IndexedClass createClass(LibraryEntity library, int classIndex, String name, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1055 return new KSetter(memberIndex, library, enclosingClass, name, | 1011 return new KSetter(memberIndex, library, enclosingClass, name, |
| 1056 isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract); | 1012 isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract); |
| 1057 } | 1013 } |
| 1058 | 1014 |
| 1059 IndexedField createField(int memberIndex, LibraryEntity library, | 1015 IndexedField createField(int memberIndex, LibraryEntity library, |
| 1060 ClassEntity enclosingClass, Name name, | 1016 ClassEntity enclosingClass, Name name, |
| 1061 {bool isStatic, bool isAssignable, bool isConst}) { | 1017 {bool isStatic, bool isAssignable, bool isConst}) { |
| 1062 return new KField(memberIndex, library, enclosingClass, name, | 1018 return new KField(memberIndex, library, enclosingClass, name, |
| 1063 isStatic: isStatic, isAssignable: isAssignable, isConst: isConst); | 1019 isStatic: isStatic, isAssignable: isAssignable, isConst: isConst); |
| 1064 } | 1020 } |
| 1065 | |
| 1066 Local createLocalFunction(String name, MemberEntity memberContext, | |
| 1067 Entity executableContext, FunctionType functionType) { | |
| 1068 return new KLocalFunction( | |
| 1069 name, memberContext, executableContext, functionType); | |
| 1070 } | |
| 1071 } | 1021 } |
| 1072 | 1022 |
| 1073 /// Implementation of [KernelToElementMapForImpact] that only supports world | 1023 /// Implementation of [KernelToElementMapForImpact] that only supports world |
| 1074 /// impact computation. | 1024 /// impact computation. |
| 1075 class KernelToElementMapForImpactImpl extends KernelToElementMapBase | 1025 class KernelToElementMapForImpactImpl extends KernelToElementMapBase |
| 1076 with | 1026 with |
| 1077 KernelToElementMapForImpactMixin, | 1027 KernelToElementMapForImpactMixin, |
| 1078 ElementCreatorMixin, | 1028 ElementCreatorMixin, |
| 1079 KElementCreatorMixin { | 1029 KElementCreatorMixin { |
| 1080 native.BehaviorBuilder _nativeBehaviorBuilder; | 1030 native.BehaviorBuilder _nativeBehaviorBuilder; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1109 } | 1059 } |
| 1110 | 1060 |
| 1111 /// Returns the kernel [ir.Procedure] node for the [method]. | 1061 /// Returns the kernel [ir.Procedure] node for the [method]. |
| 1112 ir.Procedure _lookupProcedure(KFunction method) { | 1062 ir.Procedure _lookupProcedure(KFunction method) { |
| 1113 return _memberData[method.memberIndex].node; | 1063 return _memberData[method.memberIndex].node; |
| 1114 } | 1064 } |
| 1115 | 1065 |
| 1116 Iterable<ConstantValue> _getClassMetadata(KClass cls) { | 1066 Iterable<ConstantValue> _getClassMetadata(KClass cls) { |
| 1117 return _classData[cls.classIndex].getMetadata(this); | 1067 return _classData[cls.classIndex].getMetadata(this); |
| 1118 } | 1068 } |
| 1069 |
| 1070 @override |
| 1071 Local getLocalFunction(ir.TreeNode node) { |
| 1072 assert( |
| 1073 node is ir.FunctionDeclaration || node is ir.FunctionExpression, |
| 1074 failedAt( |
| 1075 CURRENT_ELEMENT_SPANNABLE, 'Invalid local function node: $node')); |
| 1076 return _localFunctionMap.putIfAbsent(node, () { |
| 1077 MemberEntity memberContext; |
| 1078 Entity executableContext; |
| 1079 ir.TreeNode parent = node.parent; |
| 1080 while (parent != null) { |
| 1081 if (parent is ir.Member) { |
| 1082 executableContext = memberContext = getMember(parent); |
| 1083 break; |
| 1084 } |
| 1085 if (parent is ir.FunctionDeclaration || |
| 1086 parent is ir.FunctionExpression) { |
| 1087 Local localFunction = getLocalFunction(parent); |
| 1088 executableContext = localFunction; |
| 1089 memberContext = localFunction.memberContext; |
| 1090 break; |
| 1091 } |
| 1092 parent = parent.parent; |
| 1093 } |
| 1094 String name; |
| 1095 FunctionType functionType; |
| 1096 if (node is ir.FunctionDeclaration) { |
| 1097 name = node.variable.name; |
| 1098 functionType = getFunctionType(node.function); |
| 1099 } else if (node is ir.FunctionExpression) { |
| 1100 functionType = getFunctionType(node.function); |
| 1101 } |
| 1102 return new KLocalFunction( |
| 1103 name, memberContext, executableContext, functionType); |
| 1104 }); |
| 1105 } |
| 1119 } | 1106 } |
| 1120 | 1107 |
| 1121 class KernelElementEnvironment implements ElementEnvironment { | 1108 class KernelElementEnvironment implements ElementEnvironment { |
| 1122 final KernelToElementMapBase elementMap; | 1109 final KernelToElementMapBase elementMap; |
| 1123 | 1110 |
| 1124 KernelElementEnvironment(this.elementMap); | 1111 KernelElementEnvironment(this.elementMap); |
| 1125 | 1112 |
| 1126 @override | 1113 @override |
| 1127 DartType get dynamicType => const DynamicType(); | 1114 DartType get dynamicType => const DynamicType(); |
| 1128 | 1115 |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1679 allTypedefs, | 1666 allTypedefs, |
| 1680 mixinUses, | 1667 mixinUses, |
| 1681 typesImplementedBySubclasses, | 1668 typesImplementedBySubclasses, |
| 1682 classHierarchyNodes, | 1669 classHierarchyNodes, |
| 1683 classSets) { | 1670 classSets) { |
| 1684 computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, | 1671 computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, |
| 1685 enableTypeAssertions: options.enableTypeAssertions); | 1672 enableTypeAssertions: options.enableTypeAssertions); |
| 1686 } | 1673 } |
| 1687 | 1674 |
| 1688 @override | 1675 @override |
| 1689 void registerClosureClass(ClassEntity cls, bool fromInstanceMember) { | 1676 void registerClosureClass(ClassEntity cls) { |
| 1690 // Tell the hierarchy that this is the super class. then we can use | 1677 throw new UnsupportedError('KernelClosedWorld.registerClosureClass'); |
| 1691 // .getSupertypes(class) | |
| 1692 IndexedClass superclass = fromInstanceMember | |
| 1693 ? commonElements.boundClosureClass | |
| 1694 : commonElements.closureClass; | |
| 1695 ClassHierarchyNode parentNode = getClassHierarchyNode(superclass); | |
| 1696 ClassHierarchyNode node = new ClassHierarchyNode( | |
| 1697 parentNode, cls, getHierarchyDepth(superclass) + 1); | |
| 1698 addClassHierarchyNode(cls, node); | |
| 1699 for (InterfaceType type in getOrderedTypeSet(superclass).types) { | |
| 1700 // TODO(efortuna): assert that the FunctionClass is in this ordered set. | |
| 1701 // If not, we need to explicitly add node as a subtype of FunctionClass. | |
| 1702 ClassSet subtypeSet = getClassSet(type.element); | |
| 1703 subtypeSet.addSubtype(node); | |
| 1704 } | |
| 1705 addClassSet(cls, new ClassSet(node)); | |
| 1706 | |
| 1707 // Ensure that the supertype's hierarchy is completely set up. | |
| 1708 var supertype = new InterfaceType(superclass, const []); | |
| 1709 ClassData superdata = elementMap._classData[superclass.classIndex]; | |
| 1710 elementMap._ensureSupertypes(superclass, superdata); | |
| 1711 elementMap._ensureThisAndRawType(superclass, superdata); | |
| 1712 | |
| 1713 elementMap.addClosureClass(cls, supertype); | |
| 1714 node.isDirectlyInstantiated = true; | |
| 1715 } | 1678 } |
| 1716 } | 1679 } |
| 1717 | 1680 |
| 1718 // Interface for testing equivalence of Kernel-based entities. | 1681 // Interface for testing equivalence of Kernel-based entities. |
| 1719 class WorldDeconstructionForTesting { | 1682 class WorldDeconstructionForTesting { |
| 1720 final KernelToElementMapBase elementMap; | 1683 final KernelToElementMapBase elementMap; |
| 1721 | 1684 |
| 1722 WorldDeconstructionForTesting(this.elementMap); | 1685 WorldDeconstructionForTesting(this.elementMap); |
| 1723 | 1686 |
| 1724 IndexedClass getSuperclassForClass(IndexedClass cls) { | 1687 IndexedClass getSuperclassForClass(IndexedClass cls) { |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2031 if (data.constructorBody != null) { | 1994 if (data.constructorBody != null) { |
| 2032 f(data.constructorBody); | 1995 f(data.constructorBody); |
| 2033 } | 1996 } |
| 2034 }); | 1997 }); |
| 2035 } | 1998 } |
| 2036 | 1999 |
| 2037 String getDeferredUri(ir.LibraryDependency node) { | 2000 String getDeferredUri(ir.LibraryDependency node) { |
| 2038 throw new UnimplementedError('JsKernelToElementMap.getDeferredUri'); | 2001 throw new UnimplementedError('JsKernelToElementMap.getDeferredUri'); |
| 2039 } | 2002 } |
| 2040 } | 2003 } |
| OLD | NEW |