| 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 import 'package:kernel/clone.dart'; | |
| 9 import 'package:kernel/type_algebra.dart'; | |
| 10 | 8 |
| 11 import '../common.dart'; | 9 import '../common.dart'; |
| 12 import '../common/names.dart' show Identifiers; | 10 import '../common/names.dart' show Identifiers; |
| 13 import '../common/resolution.dart'; | 11 import '../common/resolution.dart'; |
| 14 import '../compile_time_constants.dart'; | 12 import '../compile_time_constants.dart'; |
| 15 import '../constants/constant_system.dart'; | 13 import '../constants/constant_system.dart'; |
| 16 import '../constants/constructors.dart'; | 14 import '../constants/constructors.dart'; |
| 17 import '../constants/evaluation.dart'; | 15 import '../constants/evaluation.dart'; |
| 18 import '../constants/expressions.dart'; | 16 import '../constants/expressions.dart'; |
| 19 import '../constants/values.dart'; | 17 import '../constants/values.dart'; |
| 20 import '../common_elements.dart'; | 18 import '../common_elements.dart'; |
| 21 import '../elements/elements.dart'; | 19 import '../elements/elements.dart'; |
| 22 import '../elements/entities.dart'; | 20 import '../elements/entities.dart'; |
| 23 import '../elements/names.dart'; | 21 import '../elements/names.dart'; |
| 24 import '../elements/types.dart'; | 22 import '../elements/types.dart'; |
| 25 import '../environment.dart'; | 23 import '../environment.dart'; |
| 26 import '../frontend_strategy.dart'; | 24 import '../frontend_strategy.dart'; |
| 27 import '../js_backend/backend_usage.dart'; | 25 import '../js_backend/backend_usage.dart'; |
| 28 import '../js_backend/constant_system_javascript.dart'; | 26 import '../js_backend/constant_system_javascript.dart'; |
| 29 import '../js_backend/interceptor_data.dart'; | 27 import '../js_backend/interceptor_data.dart'; |
| 30 import '../js_backend/native_data.dart'; | 28 import '../js_backend/native_data.dart'; |
| 31 import '../js_backend/no_such_method_registry.dart'; | 29 import '../js_backend/no_such_method_registry.dart'; |
| 32 import '../js_model/elements.dart'; | 30 import '../js_model/elements.dart'; |
| 33 import '../native/native.dart' as native; | 31 import '../native/native.dart' as native; |
| 34 import '../native/resolver.dart'; | 32 import '../native/resolver.dart'; |
| 35 import '../ordered_typeset.dart'; | 33 import '../ordered_typeset.dart'; |
| 36 import '../ssa/kernel_impact.dart'; | |
| 37 import '../universe/class_set.dart'; | 34 import '../universe/class_set.dart'; |
| 38 import '../universe/function_set.dart'; | 35 import '../universe/function_set.dart'; |
| 39 import '../universe/selector.dart'; | 36 import '../universe/selector.dart'; |
| 40 import '../universe/world_builder.dart'; | 37 import '../universe/world_builder.dart'; |
| 41 import '../world.dart'; | 38 import '../world.dart'; |
| 42 import '../util/util.dart' show Link, LinkBuilder; | 39 import '../util/util.dart' show Link, LinkBuilder; |
| 43 import 'element_map.dart'; | 40 import 'element_map.dart'; |
| 44 import 'element_map_mixins.dart'; | 41 import 'element_map_mixins.dart'; |
| 45 import 'elements.dart'; | 42 import 'elements.dart'; |
| 43 import 'env.dart'; |
| 44 import 'kelements.dart'; |
| 46 | 45 |
| 47 part 'native_basic_data.dart'; | 46 part 'native_basic_data.dart'; |
| 48 part 'no_such_method_resolver.dart'; | 47 part 'no_such_method_resolver.dart'; |
| 49 part 'types.dart'; | 48 part 'types.dart'; |
| 50 | 49 |
| 51 /// Interface for kernel queries needed to implement the [CodegenWorldBuilder]. | 50 /// Interface for kernel queries needed to implement the [CodegenWorldBuilder]. |
| 52 abstract class KernelToWorldBuilder implements KernelToElementMapForBuilding { | 51 abstract class KernelToWorldBuilder implements KernelToElementMapForBuilding { |
| 53 /// Returns `true` if [field] has a constant initializer. | 52 /// Returns `true` if [field] has a constant initializer. |
| 54 bool hasConstantFieldInitializer(FieldEntity field); | 53 bool hasConstantFieldInitializer(FieldEntity field); |
| 55 | 54 |
| 56 /// Returns the constant initializer for [field]. | 55 /// Returns the constant initializer for [field]. |
| 57 ConstantValue getConstantFieldInitializer(FieldEntity field); | 56 ConstantValue getConstantFieldInitializer(FieldEntity field); |
| 58 | 57 |
| 59 /// Calls [f] for each parameter of [function] providing the type and name of | 58 /// Calls [f] for each parameter of [function] providing the type and name of |
| 60 /// the parameter and the [defaultValue] if the parameter is optional. | 59 /// the parameter and the [defaultValue] if the parameter is optional. |
| 61 void forEachParameter(FunctionEntity function, | 60 void forEachParameter(FunctionEntity function, |
| 62 void f(DartType type, String name, ConstantValue defaultValue)); | 61 void f(DartType type, String name, ConstantValue defaultValue)); |
| 63 } | 62 } |
| 64 | 63 |
| 65 class KernelToElementMapBase extends KernelToElementMapBaseMixin { | 64 abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
| 66 final DiagnosticReporter reporter; | 65 final DiagnosticReporter reporter; |
| 67 CommonElements _commonElements; | 66 CommonElements _commonElements; |
| 68 ElementEnvironment _elementEnvironment; | 67 ElementEnvironment _elementEnvironment; |
| 69 DartTypeConverter _typeConverter; | 68 DartTypeConverter _typeConverter; |
| 70 KernelConstantEnvironment _constantEnvironment; | 69 KernelConstantEnvironment _constantEnvironment; |
| 70 _KernelDartTypes _types; |
| 71 | 71 |
| 72 /// Library environment. Used for fast lookup. | 72 /// Library environment. Used for fast lookup. |
| 73 _KEnv _env = new _KEnv(); | 73 ProgramEnv _env = new ProgramEnv(); |
| 74 | 74 |
| 75 /// List of library environments by `KLibrary.libraryIndex`. This is used for | 75 /// List of library environments by `IndexedLibrary.libraryIndex`. This is |
| 76 /// fast lookup into library classes and members. | 76 /// used for fast lookup into library classes and members. |
| 77 List<_KLibraryEnv> _libraryEnvs = <_KLibraryEnv>[]; | 77 List<LibraryEnv> _libraryEnvs = <LibraryEnv>[]; |
| 78 | 78 |
| 79 /// List of class environments by `KClass.classIndex`. This is used for | 79 /// List of class environments by `IndexedClass.classIndex`. This is used for |
| 80 /// fast lookup into class members. | 80 /// fast lookup into class members. |
| 81 List<_KClassEnv> _classEnvs = <_KClassEnv>[]; | 81 List<ClassEnv> _classEnvs = <ClassEnv>[]; |
| 82 | 82 |
| 83 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; | 83 /// List of member data by `IndexedMember.classIndex`. This is used for |
| 84 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; | 84 /// fast lookup into member properties. |
| 85 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = | 85 List<MemberData> _memberList = <MemberData>[]; |
| 86 <ir.TypeParameter, KTypeVariable>{}; | |
| 87 | |
| 88 List<_MemberData> _memberList = <_MemberData>[]; | |
| 89 | |
| 90 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; | |
| 91 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; | |
| 92 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; | |
| 93 | |
| 94 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = | |
| 95 <ir.TreeNode, KLocalFunction>{}; | |
| 96 | 86 |
| 97 KernelToElementMapBase(this.reporter, Environment environment) { | 87 KernelToElementMapBase(this.reporter, Environment environment) { |
| 98 _elementEnvironment = new KernelElementEnvironment(this); | 88 _elementEnvironment = new KernelElementEnvironment(this); |
| 99 _commonElements = new CommonElements(_elementEnvironment); | 89 _commonElements = new CommonElements(_elementEnvironment); |
| 100 _constantEnvironment = new KernelConstantEnvironment(this, environment); | 90 _constantEnvironment = new KernelConstantEnvironment(this, environment); |
| 101 _typeConverter = new DartTypeConverter(this); | 91 _typeConverter = new DartTypeConverter(this); |
| 92 _types = new _KernelDartTypes(this); |
| 102 } | 93 } |
| 103 | 94 |
| 95 DartTypes get types => _types; |
| 96 |
| 104 @override | 97 @override |
| 105 ElementEnvironment get elementEnvironment => _elementEnvironment; | 98 ElementEnvironment get elementEnvironment => _elementEnvironment; |
| 106 | 99 |
| 107 @override | 100 @override |
| 108 CommonElements get commonElements => _commonElements; | 101 CommonElements get commonElements => _commonElements; |
| 109 | 102 |
| 110 KMethod get _mainFunction { | 103 FunctionEntity get _mainFunction { |
| 111 return _env.mainMethod != null ? _getMethod(_env.mainMethod) : null; | 104 return _env.mainMethod != null ? _getMethod(_env.mainMethod) : null; |
| 112 } | 105 } |
| 113 | 106 |
| 114 KLibrary get _mainLibrary { | 107 LibraryEntity get _mainLibrary { |
| 115 return _env.mainMethod != null | 108 return _env.mainMethod != null |
| 116 ? _getLibrary(_env.mainMethod.enclosingLibrary) | 109 ? _getLibrary(_env.mainMethod.enclosingLibrary) |
| 117 : null; | 110 : null; |
| 118 } | 111 } |
| 119 | 112 |
| 120 Iterable<LibraryEntity> get _libraries { | 113 Iterable<LibraryEntity> get _libraries; |
| 121 if (_env.length != _libraryMap.length) { | |
| 122 // Create a [KLibrary] for each library. | |
| 123 _env.forEachLibrary((_KLibraryEnv env) { | |
| 124 _getLibrary(env.library, env); | |
| 125 }); | |
| 126 } | |
| 127 return _libraryMap.values; | |
| 128 } | |
| 129 | 114 |
| 130 LibraryEntity lookupLibrary(Uri uri) { | 115 LibraryEntity lookupLibrary(Uri uri) { |
| 131 _KLibraryEnv libraryEnv = _env.lookupLibrary(uri); | 116 LibraryEnv libraryEnv = _env.lookupLibrary(uri); |
| 132 if (libraryEnv == null) return null; | 117 if (libraryEnv == null) return null; |
| 133 return _getLibrary(libraryEnv.library, libraryEnv); | 118 return _getLibrary(libraryEnv.library, libraryEnv); |
| 134 } | 119 } |
| 135 | 120 |
| 136 String _getLibraryName(KLibrary library) { | 121 String _getLibraryName(KLibrary library) { |
| 137 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 122 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 138 return libraryEnv.library.name ?? ''; | 123 return libraryEnv.library.name ?? ''; |
| 139 } | 124 } |
| 140 | 125 |
| 141 MemberEntity lookupLibraryMember(KLibrary library, String name, | 126 MemberEntity lookupLibraryMember(KLibrary library, String name, |
| 142 {bool setter: false}) { | 127 {bool setter: false}) { |
| 143 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 128 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 144 ir.Member member = libraryEnv.lookupMember(name, setter: setter); | 129 ir.Member member = libraryEnv.lookupMember(name, setter: setter); |
| 145 return member != null ? getMember(member) : null; | 130 return member != null ? getMember(member) : null; |
| 146 } | 131 } |
| 147 | 132 |
| 148 void _forEachLibraryMember(KLibrary library, void f(MemberEntity member)) { | 133 void _forEachLibraryMember(KLibrary library, void f(MemberEntity member)) { |
| 149 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 134 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 150 libraryEnv.forEachMember((ir.Member node) { | 135 libraryEnv.forEachMember((ir.Member node) { |
| 151 f(getMember(node)); | 136 f(getMember(node)); |
| 152 }); | 137 }); |
| 153 } | 138 } |
| 154 | 139 |
| 155 ClassEntity lookupClass(KLibrary library, String name) { | 140 ClassEntity lookupClass(KLibrary library, String name) { |
| 156 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 141 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 157 _KClassEnv classEnv = libraryEnv.lookupClass(name); | 142 ClassEnv classEnv = libraryEnv.lookupClass(name); |
| 158 if (classEnv != null) { | 143 if (classEnv != null) { |
| 159 return _getClass(classEnv.cls, classEnv); | 144 return _getClass(classEnv.cls, classEnv); |
| 160 } | 145 } |
| 161 return null; | 146 return null; |
| 162 } | 147 } |
| 163 | 148 |
| 164 void _forEachClass(KLibrary library, void f(ClassEntity cls)) { | 149 void _forEachClass(KLibrary library, void f(ClassEntity cls)) { |
| 165 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 150 LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 166 libraryEnv.forEachClass((_KClassEnv classEnv) { | 151 libraryEnv.forEachClass((ClassEnv classEnv) { |
| 167 if (!classEnv.isUnnamedMixinApplication) { | 152 if (!classEnv.isUnnamedMixinApplication) { |
| 168 f(_getClass(classEnv.cls, classEnv)); | 153 f(_getClass(classEnv.cls, classEnv)); |
| 169 } | 154 } |
| 170 }); | 155 }); |
| 171 } | 156 } |
| 172 | 157 |
| 173 MemberEntity lookupClassMember(KClass cls, String name, | 158 MemberEntity lookupClassMember(IndexedClass cls, String name, |
| 174 {bool setter: false}) { | 159 {bool setter: false}) { |
| 175 _KClassEnv classEnv = _classEnvs[cls.classIndex]; | 160 ClassEnv classEnv = _classEnvs[cls.classIndex]; |
| 176 ir.Member member = classEnv.lookupMember(name, setter: setter); | 161 ir.Member member = classEnv.lookupMember(name, setter: setter); |
| 177 return member != null ? getMember(member) : null; | 162 return member != null ? getMember(member) : null; |
| 178 } | 163 } |
| 179 | 164 |
| 180 ConstructorEntity lookupConstructor(KClass cls, String name) { | 165 ConstructorEntity lookupConstructor(IndexedClass cls, String name) { |
| 181 _KClassEnv classEnv = _classEnvs[cls.classIndex]; | 166 ClassEnv classEnv = _classEnvs[cls.classIndex]; |
| 182 ir.Member member = classEnv.lookupConstructor(name); | 167 ir.Member member = classEnv.lookupConstructor(name); |
| 183 return member != null ? getConstructor(member) : null; | 168 return member != null ? getConstructor(member) : null; |
| 184 } | 169 } |
| 185 | 170 |
| 186 @override | 171 @override |
| 187 InterfaceType createInterfaceType( | 172 InterfaceType createInterfaceType( |
| 188 ir.Class cls, List<ir.DartType> typeArguments) { | 173 ir.Class cls, List<ir.DartType> typeArguments) { |
| 189 return new InterfaceType(getClass(cls), getDartTypes(typeArguments)); | 174 return new InterfaceType(getClass(cls), getDartTypes(typeArguments)); |
| 190 } | 175 } |
| 191 | 176 |
| 192 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); | 177 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); |
| 193 | 178 |
| 194 KLibrary _getLibrary(ir.Library node, [_KLibraryEnv libraryEnv]) { | 179 LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]); |
| 195 return _libraryMap.putIfAbsent(node, () { | |
| 196 Uri canonicalUri = node.importUri; | |
| 197 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(canonicalUri)); | |
| 198 String name = node.name; | |
| 199 if (name == null) { | |
| 200 // Use the file name as script name. | |
| 201 String path = canonicalUri.path; | |
| 202 name = path.substring(path.lastIndexOf('/') + 1); | |
| 203 } | |
| 204 return new KLibrary(_libraryMap.length, name, canonicalUri); | |
| 205 }); | |
| 206 } | |
| 207 | 180 |
| 208 @override | 181 @override |
| 209 ClassEntity getClass(ir.Class node) => _getClass(node); | 182 ClassEntity getClass(ir.Class node) => _getClass(node); |
| 210 | 183 |
| 211 KClass _getClass(ir.Class node, [_KClassEnv classEnv]) { | 184 ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]); |
| 212 return _classMap.putIfAbsent(node, () { | |
| 213 KLibrary library = _getLibrary(node.enclosingLibrary); | |
| 214 if (classEnv == null) { | |
| 215 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); | |
| 216 } | |
| 217 _classEnvs.add(classEnv); | |
| 218 return new KClass(library, _classMap.length, node.name, | |
| 219 isAbstract: node.isAbstract); | |
| 220 }); | |
| 221 } | |
| 222 | 185 |
| 223 InterfaceType _getSuperType(KClass cls) { | 186 InterfaceType _getSuperType(IndexedClass cls) { |
| 224 _KClassEnv env = _classEnvs[cls.classIndex]; | 187 ClassEnv env = _classEnvs[cls.classIndex]; |
| 225 _ensureSupertypes(cls, env); | 188 _ensureSupertypes(cls, env); |
| 226 return env.supertype; | 189 return env.supertype; |
| 227 } | 190 } |
| 228 | 191 |
| 229 void _ensureThisAndRawType(KClass cls, _KClassEnv env) { | 192 void _ensureThisAndRawType(ClassEntity cls, ClassEnv env) { |
| 230 if (env.thisType == null) { | 193 if (env.thisType == null) { |
| 231 ir.Class node = env.cls; | 194 ir.Class node = env.cls; |
| 232 // TODO(johnniwinther): Add the type argument to the list literal when we | 195 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 233 // no longer use resolution types. | 196 // no longer use resolution types. |
| 234 if (node.typeParameters.isEmpty) { | 197 if (node.typeParameters.isEmpty) { |
| 235 env.thisType = | 198 env.thisType = |
| 236 env.rawType = new InterfaceType(cls, const/*<DartType>*/ []); | 199 env.rawType = new InterfaceType(cls, const/*<DartType>*/ []); |
| 237 } else { | 200 } else { |
| 238 env.thisType = new InterfaceType( | 201 env.thisType = new InterfaceType( |
| 239 cls, | 202 cls, |
| 240 new List/*<DartType>*/ .generate(node.typeParameters.length, | 203 new List/*<DartType>*/ .generate(node.typeParameters.length, |
| 241 (int index) { | 204 (int index) { |
| 242 return new TypeVariableType( | 205 return new TypeVariableType( |
| 243 _getTypeVariable(node.typeParameters[index])); | 206 _getTypeVariable(node.typeParameters[index])); |
| 244 })); | 207 })); |
| 245 env.rawType = new InterfaceType( | 208 env.rawType = new InterfaceType( |
| 246 cls, | 209 cls, |
| 247 new List/*<DartType>*/ .filled( | 210 new List/*<DartType>*/ .filled( |
| 248 node.typeParameters.length, const DynamicType())); | 211 node.typeParameters.length, const DynamicType())); |
| 249 } | 212 } |
| 250 } | 213 } |
| 251 } | 214 } |
| 252 | 215 |
| 253 TypeVariableEntity getTypeVariable(ir.TypeParameter node) => | 216 TypeVariableEntity getTypeVariable(ir.TypeParameter node) => |
| 254 _getTypeVariable(node); | 217 _getTypeVariable(node); |
| 255 | 218 |
| 256 KTypeVariable _getTypeVariable(ir.TypeParameter node) { | 219 TypeVariableEntity _getTypeVariable(ir.TypeParameter node); |
| 257 return _typeVariableMap.putIfAbsent(node, () { | |
| 258 if (node.parent is ir.Class) { | |
| 259 ir.Class cls = node.parent; | |
| 260 int index = cls.typeParameters.indexOf(node); | |
| 261 return new KTypeVariable(_getClass(cls), node.name, index); | |
| 262 } | |
| 263 if (node.parent is ir.FunctionNode) { | |
| 264 ir.FunctionNode func = node.parent; | |
| 265 int index = func.typeParameters.indexOf(node); | |
| 266 if (func.parent is ir.Constructor) { | |
| 267 ir.Constructor constructor = func.parent; | |
| 268 ir.Class cls = constructor.enclosingClass; | |
| 269 return _getTypeVariable(cls.typeParameters[index]); | |
| 270 } | |
| 271 if (func.parent is ir.Procedure) { | |
| 272 ir.Procedure procedure = func.parent; | |
| 273 if (procedure.kind == ir.ProcedureKind.Factory) { | |
| 274 ir.Class cls = procedure.enclosingClass; | |
| 275 return _getTypeVariable(cls.typeParameters[index]); | |
| 276 } else { | |
| 277 return new KTypeVariable(_getMethod(procedure), node.name, index); | |
| 278 } | |
| 279 } | |
| 280 } | |
| 281 throw new UnsupportedError('Unsupported type parameter type node $node.'); | |
| 282 }); | |
| 283 } | |
| 284 | 220 |
| 285 void _ensureSupertypes(KClass cls, _KClassEnv env) { | 221 void _ensureSupertypes(ClassEntity cls, ClassEnv env) { |
| 286 if (env.orderedTypeSet == null) { | 222 if (env.orderedTypeSet == null) { |
| 287 _ensureThisAndRawType(cls, env); | 223 _ensureThisAndRawType(cls, env); |
| 288 | 224 |
| 289 ir.Class node = env.cls; | 225 ir.Class node = env.cls; |
| 290 | 226 |
| 291 if (node.supertype == null) { | 227 if (node.supertype == null) { |
| 292 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); | 228 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); |
| 293 env.isMixinApplication = false; | 229 env.isMixinApplication = false; |
| 294 env.interfaces = const <InterfaceType>[]; | 230 env.interfaces = const <InterfaceType>[]; |
| 295 } else { | 231 } else { |
| 296 InterfaceType processSupertype(ir.Supertype node) { | 232 InterfaceType processSupertype(ir.Supertype node) { |
| 297 InterfaceType type = _typeConverter.visitSupertype(node); | 233 InterfaceType type = _typeConverter.visitSupertype(node); |
| 298 KClass superclass = type.element; | 234 IndexedClass superclass = type.element; |
| 299 _KClassEnv env = _classEnvs[superclass.classIndex]; | 235 ClassEnv env = _classEnvs[superclass.classIndex]; |
| 300 _ensureSupertypes(superclass, env); | 236 _ensureSupertypes(superclass, env); |
| 301 return type; | 237 return type; |
| 302 } | 238 } |
| 303 | 239 |
| 304 env.supertype = processSupertype(node.supertype); | 240 env.supertype = processSupertype(node.supertype); |
| 305 LinkBuilder<InterfaceType> linkBuilder = | 241 LinkBuilder<InterfaceType> linkBuilder = |
| 306 new LinkBuilder<InterfaceType>(); | 242 new LinkBuilder<InterfaceType>(); |
| 307 if (node.mixedInType != null) { | 243 if (node.mixedInType != null) { |
| 308 env.isMixinApplication = true; | 244 env.isMixinApplication = true; |
| 309 linkBuilder | 245 linkBuilder |
| (...skipping 28 matching lines...) Expand all Loading... |
| 338 } | 274 } |
| 339 } | 275 } |
| 340 throw new UnsupportedError("Unexpected member: $node"); | 276 throw new UnsupportedError("Unexpected member: $node"); |
| 341 } | 277 } |
| 342 | 278 |
| 343 MemberEntity getSuperMember(ir.Member context, ir.Name name, ir.Member target, | 279 MemberEntity getSuperMember(ir.Member context, ir.Name name, ir.Member target, |
| 344 {bool setter: false}) { | 280 {bool setter: false}) { |
| 345 if (target != null) { | 281 if (target != null) { |
| 346 return getMember(target); | 282 return getMember(target); |
| 347 } | 283 } |
| 348 KClass cls = getMember(context).enclosingClass; | 284 ClassEntity cls = getMember(context).enclosingClass; |
| 349 KClass superclass = _getSuperType(cls)?.element; | 285 IndexedClass superclass = _getSuperType(cls)?.element; |
| 350 while (superclass != null) { | 286 while (superclass != null) { |
| 351 _KClassEnv env = _classEnvs[superclass.classIndex]; | 287 ClassEnv env = _classEnvs[superclass.classIndex]; |
| 352 ir.Member superMember = env.lookupMember(name.name, setter: setter); | 288 ir.Member superMember = env.lookupMember(name.name, setter: setter); |
| 353 if (superMember != null) { | 289 if (superMember != null) { |
| 354 return getMember(superMember); | 290 return getMember(superMember); |
| 355 } | 291 } |
| 356 superclass = _getSuperType(superclass)?.element; | 292 superclass = _getSuperType(superclass)?.element; |
| 357 } | 293 } |
| 358 throw new SpannableAssertionFailure( | 294 throw new SpannableAssertionFailure( |
| 359 cls, "No super method member found for ${name} in $cls."); | 295 cls, "No super method member found for ${name} in $cls."); |
| 360 } | 296 } |
| 361 | 297 |
| 362 @override | 298 @override |
| 363 ConstructorEntity getConstructor(ir.Member node) => _getConstructor(node); | 299 ConstructorEntity getConstructor(ir.Member node) => _getConstructor(node); |
| 364 | 300 |
| 365 KConstructor _getConstructor(ir.Member node) { | 301 ConstructorEntity _getConstructor(ir.Member node); |
| 366 return _constructorMap.putIfAbsent(node, () { | |
| 367 int memberIndex = _memberList.length; | |
| 368 KConstructor constructor; | |
| 369 KClass enclosingClass = _getClass(node.enclosingClass); | |
| 370 Name name = getName(node.name); | |
| 371 bool isExternal = node.isExternal; | |
| 372 | |
| 373 ir.FunctionNode functionNode; | |
| 374 if (node is ir.Constructor) { | |
| 375 functionNode = node.function; | |
| 376 constructor = new KGenerativeConstructor(memberIndex, enclosingClass, | |
| 377 name, _getParameterStructure(functionNode), | |
| 378 isExternal: isExternal, isConst: node.isConst); | |
| 379 } else if (node is ir.Procedure) { | |
| 380 functionNode = node.function; | |
| 381 bool isFromEnvironment = isExternal && | |
| 382 name.text == 'fromEnvironment' && | |
| 383 const ['int', 'bool', 'String'].contains(enclosingClass.name); | |
| 384 constructor = new KFactoryConstructor(memberIndex, enclosingClass, name, | |
| 385 _getParameterStructure(functionNode), | |
| 386 isExternal: isExternal, | |
| 387 isConst: node.isConst, | |
| 388 isFromEnvironmentConstructor: isFromEnvironment); | |
| 389 } else { | |
| 390 // TODO(johnniwinther): Convert `node.location` to a [SourceSpan]. | |
| 391 throw new SpannableAssertionFailure( | |
| 392 NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}."); | |
| 393 } | |
| 394 _memberList.add(new _ConstructorData(node, functionNode)); | |
| 395 return constructor; | |
| 396 }); | |
| 397 } | |
| 398 | 302 |
| 399 ConstructorEntity getSuperConstructor( | 303 ConstructorEntity getSuperConstructor( |
| 400 ir.Constructor sourceNode, ir.Member targetNode) { | 304 ir.Constructor sourceNode, ir.Member targetNode) { |
| 401 KConstructor source = getConstructor(sourceNode); | 305 ConstructorEntity source = getConstructor(sourceNode); |
| 402 KClass sourceClass = source.enclosingClass; | 306 ClassEntity sourceClass = source.enclosingClass; |
| 403 KConstructor target = getConstructor(targetNode); | 307 ConstructorEntity target = getConstructor(targetNode); |
| 404 KClass targetClass = target.enclosingClass; | 308 ClassEntity targetClass = target.enclosingClass; |
| 405 KClass superClass = _getSuperType(sourceClass)?.element; | 309 IndexedClass superClass = _getSuperType(sourceClass)?.element; |
| 406 if (superClass == targetClass) { | 310 if (superClass == targetClass) { |
| 407 return target; | 311 return target; |
| 408 } | 312 } |
| 409 _KClassEnv env = _classEnvs[superClass.classIndex]; | 313 ClassEnv env = _classEnvs[superClass.classIndex]; |
| 410 ir.Member member = env.lookupConstructor(target.name); | 314 ir.Member member = env.lookupConstructor(target.name); |
| 411 if (member != null) { | 315 if (member != null) { |
| 412 return getConstructor(member); | 316 return getConstructor(member); |
| 413 } | 317 } |
| 414 throw new SpannableAssertionFailure( | 318 throw new SpannableAssertionFailure( |
| 415 source, "Super constructor for $source not found."); | 319 source, "Super constructor for $source not found."); |
| 416 } | 320 } |
| 417 | 321 |
| 418 @override | 322 @override |
| 419 FunctionEntity getMethod(ir.Procedure node) => _getMethod(node); | 323 FunctionEntity getMethod(ir.Procedure node) => _getMethod(node); |
| 420 | 324 |
| 421 KFunction _getMethod(ir.Procedure node) { | 325 FunctionEntity _getMethod(ir.Procedure node); |
| 422 return _methodMap.putIfAbsent(node, () { | |
| 423 int memberIndex = _memberList.length; | |
| 424 KLibrary library; | |
| 425 KClass enclosingClass; | |
| 426 if (node.enclosingClass != null) { | |
| 427 enclosingClass = _getClass(node.enclosingClass); | |
| 428 library = enclosingClass.library; | |
| 429 } else { | |
| 430 library = _getLibrary(node.enclosingLibrary); | |
| 431 } | |
| 432 Name name = getName(node.name); | |
| 433 bool isStatic = node.isStatic; | |
| 434 bool isExternal = node.isExternal; | |
| 435 bool isAbstract = node.isAbstract; | |
| 436 KFunction function; | |
| 437 AsyncMarker asyncMarker; | |
| 438 switch (node.function.asyncMarker) { | |
| 439 case ir.AsyncMarker.Async: | |
| 440 asyncMarker = AsyncMarker.ASYNC; | |
| 441 break; | |
| 442 case ir.AsyncMarker.AsyncStar: | |
| 443 asyncMarker = AsyncMarker.ASYNC_STAR; | |
| 444 break; | |
| 445 case ir.AsyncMarker.Sync: | |
| 446 asyncMarker = AsyncMarker.SYNC; | |
| 447 break; | |
| 448 case ir.AsyncMarker.SyncStar: | |
| 449 asyncMarker = AsyncMarker.SYNC_STAR; | |
| 450 break; | |
| 451 case ir.AsyncMarker.SyncYielding: | |
| 452 throw new UnsupportedError( | |
| 453 "Async marker ${node.function.asyncMarker} is not supported."); | |
| 454 } | |
| 455 switch (node.kind) { | |
| 456 case ir.ProcedureKind.Factory: | |
| 457 throw new UnsupportedError("Cannot create method from factory."); | |
| 458 case ir.ProcedureKind.Getter: | |
| 459 function = new KGetter( | |
| 460 memberIndex, library, enclosingClass, name, asyncMarker, | |
| 461 isStatic: isStatic, | |
| 462 isExternal: isExternal, | |
| 463 isAbstract: isAbstract); | |
| 464 break; | |
| 465 case ir.ProcedureKind.Method: | |
| 466 case ir.ProcedureKind.Operator: | |
| 467 function = new KMethod(memberIndex, library, enclosingClass, name, | |
| 468 _getParameterStructure(node.function), asyncMarker, | |
| 469 isStatic: isStatic, | |
| 470 isExternal: isExternal, | |
| 471 isAbstract: isAbstract); | |
| 472 break; | |
| 473 case ir.ProcedureKind.Setter: | |
| 474 assert(asyncMarker == AsyncMarker.SYNC); | |
| 475 function = new KSetter( | |
| 476 memberIndex, library, enclosingClass, getName(node.name).setter, | |
| 477 isStatic: isStatic, | |
| 478 isExternal: isExternal, | |
| 479 isAbstract: isAbstract); | |
| 480 break; | |
| 481 } | |
| 482 _memberList.add(new _FunctionData(node, node.function)); | |
| 483 return function; | |
| 484 }); | |
| 485 } | |
| 486 | 326 |
| 487 @override | 327 @override |
| 488 FieldEntity getField(ir.Field node) => _getField(node); | 328 FieldEntity getField(ir.Field node) => _getField(node); |
| 489 | 329 |
| 490 KField _getField(ir.Field node) { | 330 FieldEntity _getField(ir.Field node); |
| 491 return _fieldMap.putIfAbsent(node, () { | |
| 492 int memberIndex = _memberList.length; | |
| 493 KLibrary library; | |
| 494 KClass enclosingClass; | |
| 495 if (node.enclosingClass != null) { | |
| 496 enclosingClass = _getClass(node.enclosingClass); | |
| 497 library = enclosingClass.library; | |
| 498 } else { | |
| 499 library = _getLibrary(node.enclosingLibrary); | |
| 500 } | |
| 501 Name name = getName(node.name); | |
| 502 bool isStatic = node.isStatic; | |
| 503 _memberList.add(new _FieldData(node)); | |
| 504 return new KField(memberIndex, library, enclosingClass, name, | |
| 505 isStatic: isStatic, | |
| 506 isAssignable: node.isMutable, | |
| 507 isConst: node.isConst); | |
| 508 }); | |
| 509 } | |
| 510 | |
| 511 ParameterStructure _getParameterStructure(ir.FunctionNode node) { | |
| 512 // TODO(johnniwinther): Cache the computed function type. | |
| 513 int requiredParameters = node.requiredParameterCount; | |
| 514 int positionalParameters = node.positionalParameters.length; | |
| 515 List<String> namedParameters = | |
| 516 node.namedParameters.map((p) => p.name).toList()..sort(); | |
| 517 return new ParameterStructure( | |
| 518 requiredParameters, positionalParameters, namedParameters); | |
| 519 } | |
| 520 | 331 |
| 521 @override | 332 @override |
| 522 Local getLocalFunction(ir.TreeNode node) => _getLocal(node); | 333 Local getLocalFunction(ir.TreeNode node) => _getLocalFunction(node); |
| 523 | 334 |
| 524 KLocalFunction _getLocal(ir.TreeNode node) { | 335 Local _getLocalFunction(ir.TreeNode node); |
| 525 return _localFunctionMap.putIfAbsent(node, () { | |
| 526 MemberEntity memberContext; | |
| 527 Entity executableContext; | |
| 528 ir.TreeNode parent = node.parent; | |
| 529 while (parent != null) { | |
| 530 if (parent is ir.Member) { | |
| 531 executableContext = memberContext = getMember(parent); | |
| 532 break; | |
| 533 } | |
| 534 if (parent is ir.FunctionDeclaration || | |
| 535 parent is ir.FunctionExpression) { | |
| 536 KLocalFunction localFunction = _getLocal(parent); | |
| 537 executableContext = localFunction; | |
| 538 memberContext = localFunction.memberContext; | |
| 539 break; | |
| 540 } | |
| 541 parent = parent.parent; | |
| 542 } | |
| 543 String name; | |
| 544 FunctionType functionType; | |
| 545 if (node is ir.FunctionDeclaration) { | |
| 546 name = node.variable.name; | |
| 547 functionType = getFunctionType(node.function); | |
| 548 } else if (node is ir.FunctionExpression) { | |
| 549 functionType = getFunctionType(node.function); | |
| 550 } | |
| 551 return new KLocalFunction( | |
| 552 name, memberContext, executableContext, functionType); | |
| 553 }); | |
| 554 } | |
| 555 | 336 |
| 556 @override | 337 @override |
| 557 DartType getDartType(ir.DartType type) => _typeConverter.convert(type); | 338 DartType getDartType(ir.DartType type) => _typeConverter.convert(type); |
| 558 | 339 |
| 559 List<DartType> getDartTypes(List<ir.DartType> types) { | 340 List<DartType> getDartTypes(List<ir.DartType> types) { |
| 560 // TODO(johnniwinther): Add the type argument to the list literal when we | 341 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 561 // no longer use resolution types. | 342 // no longer use resolution types. |
| 562 List<DartType> list = /*<DartType>*/ []; | 343 List<DartType> list = /*<DartType>*/ []; |
| 563 types.forEach((ir.DartType type) { | 344 types.forEach((ir.DartType type) { |
| 564 list.add(getDartType(type)); | 345 list.add(getDartType(type)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 ConstantValue computeConstantValue(ConstantExpression constant, | 379 ConstantValue computeConstantValue(ConstantExpression constant, |
| 599 {bool requireConstant: true}) { | 380 {bool requireConstant: true}) { |
| 600 return _constantEnvironment.getConstantValue(constant); | 381 return _constantEnvironment.getConstantValue(constant); |
| 601 } | 382 } |
| 602 | 383 |
| 603 DartType _substByContext(DartType type, InterfaceType context) { | 384 DartType _substByContext(DartType type, InterfaceType context) { |
| 604 return type.subst( | 385 return type.subst( |
| 605 context.typeArguments, _getThisType(context.element).typeArguments); | 386 context.typeArguments, _getThisType(context.element).typeArguments); |
| 606 } | 387 } |
| 607 | 388 |
| 608 InterfaceType _getThisType(KClass cls) { | 389 InterfaceType _getThisType(IndexedClass cls) { |
| 609 _KClassEnv env = _classEnvs[cls.classIndex]; | 390 ClassEnv env = _classEnvs[cls.classIndex]; |
| 610 _ensureThisAndRawType(cls, env); | 391 _ensureThisAndRawType(cls, env); |
| 611 return env.thisType; | 392 return env.thisType; |
| 612 } | 393 } |
| 613 | 394 |
| 614 InterfaceType _getRawType(KClass cls) { | 395 InterfaceType _getRawType(IndexedClass cls) { |
| 615 _KClassEnv env = _classEnvs[cls.classIndex]; | 396 ClassEnv env = _classEnvs[cls.classIndex]; |
| 616 _ensureThisAndRawType(cls, env); | 397 _ensureThisAndRawType(cls, env); |
| 617 return env.rawType; | 398 return env.rawType; |
| 618 } | 399 } |
| 619 | 400 |
| 620 FunctionType _getFunctionType(KFunction function) { | 401 FunctionType _getFunctionType(IndexedMember function) { |
| 621 _FunctionData data = _memberList[function.memberIndex]; | 402 FunctionData data = _memberList[function.memberIndex]; |
| 622 return data.getFunctionType(this); | 403 return data.getFunctionType(this); |
| 623 } | 404 } |
| 624 | 405 |
| 625 ClassEntity _getAppliedMixin(KClass cls) { | 406 ClassEntity _getAppliedMixin(IndexedClass cls) { |
| 626 _KClassEnv env = _classEnvs[cls.classIndex]; | 407 ClassEnv env = _classEnvs[cls.classIndex]; |
| 627 _ensureSupertypes(cls, env); | 408 _ensureSupertypes(cls, env); |
| 628 return env.mixedInType?.element; | 409 return env.mixedInType?.element; |
| 629 } | 410 } |
| 630 | 411 |
| 631 bool _isMixinApplication(KClass cls) { | 412 bool _isMixinApplication(IndexedClass cls) { |
| 632 _KClassEnv env = _classEnvs[cls.classIndex]; | 413 ClassEnv env = _classEnvs[cls.classIndex]; |
| 633 _ensureSupertypes(cls, env); | 414 _ensureSupertypes(cls, env); |
| 634 return env.isMixinApplication; | 415 return env.isMixinApplication; |
| 635 } | 416 } |
| 636 | 417 |
| 637 bool _isUnnamedMixinApplication(KClass cls) { | 418 bool _isUnnamedMixinApplication(IndexedClass cls) { |
| 638 _KClassEnv env = _classEnvs[cls.classIndex]; | 419 ClassEnv env = _classEnvs[cls.classIndex]; |
| 639 _ensureSupertypes(cls, env); | 420 _ensureSupertypes(cls, env); |
| 640 return env.isUnnamedMixinApplication; | 421 return env.isUnnamedMixinApplication; |
| 641 } | 422 } |
| 642 | 423 |
| 643 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { | 424 void _forEachSupertype(IndexedClass cls, void f(InterfaceType supertype)) { |
| 644 _KClassEnv env = _classEnvs[cls.classIndex]; | 425 ClassEnv env = _classEnvs[cls.classIndex]; |
| 645 _ensureSupertypes(cls, env); | 426 _ensureSupertypes(cls, env); |
| 646 env.orderedTypeSet.supertypes.forEach(f); | 427 env.orderedTypeSet.supertypes.forEach(f); |
| 647 } | 428 } |
| 648 | 429 |
| 649 void _forEachMixin(KClass cls, void f(ClassEntity mixin)) { | 430 void _forEachMixin(IndexedClass cls, void f(ClassEntity mixin)) { |
| 650 while (cls != null) { | 431 while (cls != null) { |
| 651 _KClassEnv env = _classEnvs[cls.classIndex]; | 432 ClassEnv env = _classEnvs[cls.classIndex]; |
| 652 _ensureSupertypes(cls, env); | 433 _ensureSupertypes(cls, env); |
| 653 if (env.mixedInType != null) { | 434 if (env.mixedInType != null) { |
| 654 f(env.mixedInType.element); | 435 f(env.mixedInType.element); |
| 655 } | 436 } |
| 656 cls = env.supertype?.element; | 437 cls = env.supertype?.element; |
| 657 } | 438 } |
| 658 } | 439 } |
| 659 | 440 |
| 660 void _forEachConstructor(KClass cls, void f(ConstructorEntity member)) { | 441 void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) { |
| 661 _KClassEnv env = _classEnvs[cls.classIndex]; | 442 ClassEnv env = _classEnvs[cls.classIndex]; |
| 662 env.forEachConstructor((ir.Member member) { | 443 env.forEachConstructor((ir.Member member) { |
| 663 f(getConstructor(member)); | 444 f(getConstructor(member)); |
| 664 }); | 445 }); |
| 665 } | 446 } |
| 666 | 447 |
| 667 void _forEachClassMember( | 448 void _forEachClassMember( |
| 668 KClass cls, void f(ClassEntity cls, MemberEntity member)) { | 449 IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) { |
| 669 _KClassEnv env = _classEnvs[cls.classIndex]; | 450 ClassEnv env = _classEnvs[cls.classIndex]; |
| 670 env.forEachMember((ir.Member member) { | 451 env.forEachMember((ir.Member member) { |
| 671 f(cls, getMember(member)); | 452 f(cls, getMember(member)); |
| 672 }); | 453 }); |
| 673 _ensureSupertypes(cls, env); | 454 _ensureSupertypes(cls, env); |
| 674 if (env.supertype != null) { | 455 if (env.supertype != null) { |
| 675 _forEachClassMember(env.supertype.element, f); | 456 _forEachClassMember(env.supertype.element, f); |
| 676 } | 457 } |
| 677 } | 458 } |
| 678 | 459 |
| 679 ConstantConstructor _getConstructorConstant(KConstructor constructor) { | 460 ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) { |
| 680 _ConstructorData data = _memberList[constructor.memberIndex]; | 461 ConstructorData data = _memberList[constructor.memberIndex]; |
| 681 return data.getConstructorConstant(this, constructor); | 462 return data.getConstructorConstant(this, constructor); |
| 682 } | 463 } |
| 683 | 464 |
| 684 ConstantExpression _getFieldConstant(KField field) { | 465 ConstantExpression _getFieldConstant(IndexedField field) { |
| 685 _FieldData data = _memberList[field.memberIndex]; | 466 FieldData data = _memberList[field.memberIndex]; |
| 686 return data.getFieldConstant(this, field); | 467 return data.getFieldConstant(this, field); |
| 687 } | 468 } |
| 469 |
| 470 InterfaceType _asInstanceOf(InterfaceType type, ClassEntity cls) { |
| 471 OrderedTypeSet orderedTypeSet = _getOrderedTypeSet(type.element); |
| 472 InterfaceType supertype = |
| 473 orderedTypeSet.asInstanceOf(cls, _getHierarchyDepth(cls)); |
| 474 if (supertype != null) { |
| 475 supertype = _substByContext(supertype, type); |
| 476 } |
| 477 return supertype; |
| 478 } |
| 479 |
| 480 OrderedTypeSet _getOrderedTypeSet(IndexedClass cls) { |
| 481 ClassEnv env = _classEnvs[cls.classIndex]; |
| 482 _ensureSupertypes(cls, env); |
| 483 return env.orderedTypeSet; |
| 484 } |
| 485 |
| 486 int _getHierarchyDepth(IndexedClass cls) { |
| 487 ClassEnv env = _classEnvs[cls.classIndex]; |
| 488 _ensureSupertypes(cls, env); |
| 489 return env.orderedTypeSet.maxDepth; |
| 490 } |
| 491 |
| 492 Iterable<InterfaceType> _getInterfaces(IndexedClass cls) { |
| 493 ClassEnv env = _classEnvs[cls.classIndex]; |
| 494 _ensureSupertypes(cls, env); |
| 495 return env.interfaces; |
| 496 } |
| 497 |
| 498 Spannable _getSpannable(MemberEntity member, ir.Node node) { |
| 499 return member; |
| 500 } |
| 501 |
| 502 ir.Member _getMemberNode(covariant IndexedMember member) { |
| 503 return _memberList[member.memberIndex].node; |
| 504 } |
| 505 |
| 506 ir.Class _getClassNode(covariant IndexedClass cls) { |
| 507 return _classEnvs[cls.classIndex].cls; |
| 508 } |
| 688 } | 509 } |
| 689 | 510 |
| 690 class KernelToElementMapForImpactImpl extends KernelToElementMapBase | 511 /// Mixin that implements the abstract methods in [KernelToElementMapBase] by |
| 691 with KernelToElementMapForImpactMixin { | 512 /// creating K-model elements. |
| 513 abstract class KElementCreatorMixin { |
| 514 ProgramEnv get _env; |
| 515 List<LibraryEnv> get _libraryEnvs; |
| 516 List<ClassEnv> get _classEnvs; |
| 517 List<MemberData> get _memberList; |
| 518 |
| 519 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; |
| 520 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; |
| 521 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = |
| 522 <ir.TypeParameter, KTypeVariable>{}; |
| 523 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; |
| 524 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; |
| 525 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; |
| 526 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = |
| 527 <ir.TreeNode, KLocalFunction>{}; |
| 528 |
| 529 Name getName(ir.Name node); |
| 530 FunctionType getFunctionType(ir.FunctionNode node); |
| 531 MemberEntity getMember(ir.Member node); |
| 532 |
| 533 Iterable<LibraryEntity> get _libraries { |
| 534 if (_env.length != _libraryMap.length) { |
| 535 // Create a [KLibrary] for each library. |
| 536 _env.forEachLibrary((LibraryEnv env) { |
| 537 _getLibrary(env.library, env); |
| 538 }); |
| 539 } |
| 540 return _libraryMap.values; |
| 541 } |
| 542 |
| 543 LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]) { |
| 544 return _libraryMap.putIfAbsent(node, () { |
| 545 Uri canonicalUri = node.importUri; |
| 546 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(canonicalUri)); |
| 547 String name = node.name; |
| 548 if (name == null) { |
| 549 // Use the file name as script name. |
| 550 String path = canonicalUri.path; |
| 551 name = path.substring(path.lastIndexOf('/') + 1); |
| 552 } |
| 553 return new KLibrary(_libraryMap.length, name, canonicalUri); |
| 554 }); |
| 555 } |
| 556 |
| 557 ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) { |
| 558 return _classMap.putIfAbsent(node, () { |
| 559 KLibrary library = _getLibrary(node.enclosingLibrary); |
| 560 if (classEnv == null) { |
| 561 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); |
| 562 } |
| 563 _classEnvs.add(classEnv); |
| 564 return new KClass(library, _classMap.length, node.name, |
| 565 isAbstract: node.isAbstract); |
| 566 }); |
| 567 } |
| 568 |
| 569 TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { |
| 570 return _typeVariableMap.putIfAbsent(node, () { |
| 571 if (node.parent is ir.Class) { |
| 572 ir.Class cls = node.parent; |
| 573 int index = cls.typeParameters.indexOf(node); |
| 574 return new KTypeVariable(_getClass(cls), node.name, index); |
| 575 } |
| 576 if (node.parent is ir.FunctionNode) { |
| 577 ir.FunctionNode func = node.parent; |
| 578 int index = func.typeParameters.indexOf(node); |
| 579 if (func.parent is ir.Constructor) { |
| 580 ir.Constructor constructor = func.parent; |
| 581 ir.Class cls = constructor.enclosingClass; |
| 582 return _getTypeVariable(cls.typeParameters[index]); |
| 583 } |
| 584 if (func.parent is ir.Procedure) { |
| 585 ir.Procedure procedure = func.parent; |
| 586 if (procedure.kind == ir.ProcedureKind.Factory) { |
| 587 ir.Class cls = procedure.enclosingClass; |
| 588 return _getTypeVariable(cls.typeParameters[index]); |
| 589 } else { |
| 590 return new KTypeVariable(_getMethod(procedure), node.name, index); |
| 591 } |
| 592 } |
| 593 } |
| 594 throw new UnsupportedError('Unsupported type parameter type node $node.'); |
| 595 }); |
| 596 } |
| 597 |
| 598 ConstructorEntity _getConstructor(ir.Member node) { |
| 599 return _constructorMap.putIfAbsent(node, () { |
| 600 int memberIndex = _memberList.length; |
| 601 KConstructor constructor; |
| 602 KClass enclosingClass = _getClass(node.enclosingClass); |
| 603 Name name = getName(node.name); |
| 604 bool isExternal = node.isExternal; |
| 605 |
| 606 ir.FunctionNode functionNode; |
| 607 if (node is ir.Constructor) { |
| 608 functionNode = node.function; |
| 609 constructor = new KGenerativeConstructor(memberIndex, enclosingClass, |
| 610 name, _getParameterStructure(functionNode), |
| 611 isExternal: isExternal, isConst: node.isConst); |
| 612 } else if (node is ir.Procedure) { |
| 613 functionNode = node.function; |
| 614 bool isFromEnvironment = isExternal && |
| 615 name.text == 'fromEnvironment' && |
| 616 const ['int', 'bool', 'String'].contains(enclosingClass.name); |
| 617 constructor = new KFactoryConstructor(memberIndex, enclosingClass, name, |
| 618 _getParameterStructure(functionNode), |
| 619 isExternal: isExternal, |
| 620 isConst: node.isConst, |
| 621 isFromEnvironmentConstructor: isFromEnvironment); |
| 622 } else { |
| 623 // TODO(johnniwinther): Convert `node.location` to a [SourceSpan]. |
| 624 throw new SpannableAssertionFailure( |
| 625 NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}."); |
| 626 } |
| 627 _memberList.add(new ConstructorData(node, functionNode)); |
| 628 return constructor; |
| 629 }); |
| 630 } |
| 631 |
| 632 FunctionEntity _getMethod(ir.Procedure node) { |
| 633 return _methodMap.putIfAbsent(node, () { |
| 634 int memberIndex = _memberList.length; |
| 635 LibraryEntity library; |
| 636 ClassEntity enclosingClass; |
| 637 if (node.enclosingClass != null) { |
| 638 enclosingClass = _getClass(node.enclosingClass); |
| 639 library = enclosingClass.library; |
| 640 } else { |
| 641 library = _getLibrary(node.enclosingLibrary); |
| 642 } |
| 643 Name name = getName(node.name); |
| 644 bool isStatic = node.isStatic; |
| 645 bool isExternal = node.isExternal; |
| 646 bool isAbstract = node.isAbstract; |
| 647 KFunction function; |
| 648 AsyncMarker asyncMarker; |
| 649 switch (node.function.asyncMarker) { |
| 650 case ir.AsyncMarker.Async: |
| 651 asyncMarker = AsyncMarker.ASYNC; |
| 652 break; |
| 653 case ir.AsyncMarker.AsyncStar: |
| 654 asyncMarker = AsyncMarker.ASYNC_STAR; |
| 655 break; |
| 656 case ir.AsyncMarker.Sync: |
| 657 asyncMarker = AsyncMarker.SYNC; |
| 658 break; |
| 659 case ir.AsyncMarker.SyncStar: |
| 660 asyncMarker = AsyncMarker.SYNC_STAR; |
| 661 break; |
| 662 case ir.AsyncMarker.SyncYielding: |
| 663 throw new UnsupportedError( |
| 664 "Async marker ${node.function.asyncMarker} is not supported."); |
| 665 } |
| 666 switch (node.kind) { |
| 667 case ir.ProcedureKind.Factory: |
| 668 throw new UnsupportedError("Cannot create method from factory."); |
| 669 case ir.ProcedureKind.Getter: |
| 670 function = new KGetter( |
| 671 memberIndex, library, enclosingClass, name, asyncMarker, |
| 672 isStatic: isStatic, |
| 673 isExternal: isExternal, |
| 674 isAbstract: isAbstract); |
| 675 break; |
| 676 case ir.ProcedureKind.Method: |
| 677 case ir.ProcedureKind.Operator: |
| 678 function = new KMethod(memberIndex, library, enclosingClass, name, |
| 679 _getParameterStructure(node.function), asyncMarker, |
| 680 isStatic: isStatic, |
| 681 isExternal: isExternal, |
| 682 isAbstract: isAbstract); |
| 683 break; |
| 684 case ir.ProcedureKind.Setter: |
| 685 assert(asyncMarker == AsyncMarker.SYNC); |
| 686 function = new KSetter( |
| 687 memberIndex, library, enclosingClass, getName(node.name).setter, |
| 688 isStatic: isStatic, |
| 689 isExternal: isExternal, |
| 690 isAbstract: isAbstract); |
| 691 break; |
| 692 } |
| 693 _memberList.add(new FunctionData(node, node.function)); |
| 694 return function; |
| 695 }); |
| 696 } |
| 697 |
| 698 FieldEntity _getField(ir.Field node) { |
| 699 return _fieldMap.putIfAbsent(node, () { |
| 700 int memberIndex = _memberList.length; |
| 701 LibraryEntity library; |
| 702 ClassEntity enclosingClass; |
| 703 if (node.enclosingClass != null) { |
| 704 enclosingClass = _getClass(node.enclosingClass); |
| 705 library = enclosingClass.library; |
| 706 } else { |
| 707 library = _getLibrary(node.enclosingLibrary); |
| 708 } |
| 709 Name name = getName(node.name); |
| 710 bool isStatic = node.isStatic; |
| 711 _memberList.add(new FieldData(node)); |
| 712 return new KField(memberIndex, library, enclosingClass, name, |
| 713 isStatic: isStatic, |
| 714 isAssignable: node.isMutable, |
| 715 isConst: node.isConst); |
| 716 }); |
| 717 } |
| 718 |
| 719 ParameterStructure _getParameterStructure(ir.FunctionNode node) { |
| 720 // TODO(johnniwinther): Cache the computed function type. |
| 721 int requiredParameters = node.requiredParameterCount; |
| 722 int positionalParameters = node.positionalParameters.length; |
| 723 List<String> namedParameters = |
| 724 node.namedParameters.map((p) => p.name).toList()..sort(); |
| 725 return new ParameterStructure( |
| 726 requiredParameters, positionalParameters, namedParameters); |
| 727 } |
| 728 |
| 729 Local _getLocalFunction(ir.TreeNode node) { |
| 730 return _localFunctionMap.putIfAbsent(node, () { |
| 731 MemberEntity memberContext; |
| 732 Entity executableContext; |
| 733 ir.TreeNode parent = node.parent; |
| 734 while (parent != null) { |
| 735 if (parent is ir.Member) { |
| 736 executableContext = memberContext = getMember(parent); |
| 737 break; |
| 738 } |
| 739 if (parent is ir.FunctionDeclaration || |
| 740 parent is ir.FunctionExpression) { |
| 741 KLocalFunction localFunction = _getLocalFunction(parent); |
| 742 executableContext = localFunction; |
| 743 memberContext = localFunction.memberContext; |
| 744 break; |
| 745 } |
| 746 parent = parent.parent; |
| 747 } |
| 748 String name; |
| 749 FunctionType functionType; |
| 750 if (node is ir.FunctionDeclaration) { |
| 751 name = node.variable.name; |
| 752 functionType = getFunctionType(node.function); |
| 753 } else if (node is ir.FunctionExpression) { |
| 754 functionType = getFunctionType(node.function); |
| 755 } |
| 756 return new KLocalFunction( |
| 757 name, memberContext, executableContext, functionType); |
| 758 }); |
| 759 } |
| 760 } |
| 761 |
| 762 /// Implementation of [KernelToElementMapForImpact] that only supports world |
| 763 /// impact computation. |
| 764 // TODO(johnniwinther): Merge this with [KernelToElementMapForImpactImpl] when |
| 765 // [JsStrategy] is the default. |
| 766 abstract class KernelToElementMapForImpactImpl |
| 767 implements |
| 768 KernelToElementMapBase, |
| 769 KernelToElementMapForImpact, |
| 770 KernelToElementMapForImpactMixin { |
| 692 native.BehaviorBuilder _nativeBehaviorBuilder; | 771 native.BehaviorBuilder _nativeBehaviorBuilder; |
| 693 | 772 |
| 694 KernelToElementMapForImpactImpl( | |
| 695 DiagnosticReporter reporter, Environment environment) | |
| 696 : super(reporter, environment) { | |
| 697 _nativeBehaviorBuilder = new KernelBehaviorBuilder(_commonElements); | |
| 698 } | |
| 699 | |
| 700 @override | |
| 701 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder; | |
| 702 } | |
| 703 | |
| 704 /// Element builder used for creating elements and types corresponding to Kernel | |
| 705 /// IR nodes. | |
| 706 class KernelToElementMapImpl extends KernelToElementMapForImpactImpl | |
| 707 with KernelToElementMapForBuildingMixin | |
| 708 implements KernelToWorldBuilder { | |
| 709 _KernelDartTypes _types; | |
| 710 | |
| 711 KernelToElementMapImpl(DiagnosticReporter reporter, Environment environment) | |
| 712 : super(reporter, environment) { | |
| 713 _types = new _KernelDartTypes(this); | |
| 714 } | |
| 715 | |
| 716 /// Adds libraries in [program] to the set of libraries. | 773 /// Adds libraries in [program] to the set of libraries. |
| 717 /// | 774 /// |
| 718 /// The main method of the first program is used as the main method for the | 775 /// The main method of the first program is used as the main method for the |
| 719 /// compilation. | 776 /// compilation. |
| 720 void addProgram(ir.Program program) { | 777 void addProgram(ir.Program program) { |
| 721 _env.addProgram(program); | 778 _env.addProgram(program); |
| 722 } | 779 } |
| 723 | 780 |
| 724 ConstantEnvironment get constantEnvironment => _constantEnvironment; | 781 @override |
| 782 native.BehaviorBuilder get nativeBehaviorBuilder => |
| 783 _nativeBehaviorBuilder ??= new KernelBehaviorBuilder(commonElements); |
| 725 | 784 |
| 726 DartTypes get types => _types; | 785 ResolutionImpact computeWorldImpact(KMember member) { |
| 727 | 786 return _memberList[member.memberIndex].getWorldImpact(this); |
| 728 @override | |
| 729 ConstantValue getFieldConstantValue(ir.Field field) { | |
| 730 // TODO(johnniwinther): Cache the result in [_FieldData]. | |
| 731 return getConstantValue(field.initializer, | |
| 732 requireConstant: field.isConst, implicitNull: !field.isConst); | |
| 733 } | |
| 734 | |
| 735 Iterable<ConstantValue> _getClassMetadata(KClass cls) { | |
| 736 return _classEnvs[cls.classIndex].getMetadata(this); | |
| 737 } | 787 } |
| 738 | 788 |
| 739 /// Returns the kernel [ir.Procedure] node for the [method]. | 789 /// Returns the kernel [ir.Procedure] node for the [method]. |
| 740 ir.Procedure _lookupProcedure(KFunction method) { | 790 ir.Procedure _lookupProcedure(KFunction method) { |
| 741 return _memberList[method.memberIndex].node; | 791 return _memberList[method.memberIndex].node; |
| 742 } | 792 } |
| 743 | 793 |
| 744 InterfaceType _asInstanceOf(InterfaceType type, KClass cls) { | 794 Iterable<ConstantValue> _getClassMetadata(KClass cls) { |
| 745 OrderedTypeSet orderedTypeSet = _getOrderedTypeSet(type.element); | 795 return _classEnvs[cls.classIndex].getMetadata(this); |
| 746 InterfaceType supertype = | |
| 747 orderedTypeSet.asInstanceOf(cls, _getHierarchyDepth(cls)); | |
| 748 if (supertype != null) { | |
| 749 supertype = _substByContext(supertype, type); | |
| 750 } | |
| 751 return supertype; | |
| 752 } | 796 } |
| 797 } |
| 753 | 798 |
| 754 OrderedTypeSet _getOrderedTypeSet(KClass cls) { | 799 /// Implementation of [KernelToElementMapForImpact] that only supports world |
| 755 _KClassEnv env = _classEnvs[cls.classIndex]; | 800 /// impact computation. |
| 756 _ensureSupertypes(cls, env); | 801 // TODO(johnniwinther): Merge this with [KernelToElementMapForImpactImpl] when |
| 757 return env.orderedTypeSet; | 802 // [JsStrategy] is the default. |
| 758 } | 803 class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase |
| 804 with |
| 805 KernelToElementMapForImpactMixin, |
| 806 KernelToElementMapForImpactImpl, |
| 807 KElementCreatorMixin { |
| 808 KernelToElementMapForImpactImpl2( |
| 809 DiagnosticReporter reporter, Environment environment) |
| 810 : super(reporter, environment); |
| 811 } |
| 759 | 812 |
| 760 int _getHierarchyDepth(KClass cls) { | 813 /// Element builder used for creating elements and types corresponding to Kernel |
| 761 _KClassEnv env = _classEnvs[cls.classIndex]; | 814 /// IR nodes. |
| 762 _ensureSupertypes(cls, env); | 815 // TODO(johnniwinther): Use this in the JsStrategy |
| 763 return env.orderedTypeSet.maxDepth; | 816 class KernelToElementMapForBuildingImpl extends KernelToElementMapBase |
| 764 } | 817 with KernelToElementMapForBuildingMixin, KElementCreatorMixin |
| 818 implements KernelToWorldBuilder { |
| 819 KernelToElementMapForBuildingImpl( |
| 820 DiagnosticReporter reporter, Environment environment) |
| 821 : super(reporter, environment); |
| 765 | 822 |
| 766 Iterable<InterfaceType> _getInterfaces(KClass cls) { | 823 ConstantEnvironment get constantEnvironment => _constantEnvironment; |
| 767 _KClassEnv env = _classEnvs[cls.classIndex]; | 824 |
| 768 _ensureSupertypes(cls, env); | 825 @override |
| 769 return env.interfaces; | 826 ConstantValue getFieldConstantValue(ir.Field field) { |
| 827 // TODO(johnniwinther): Cache the result in [FieldData]. |
| 828 return getConstantValue(field.initializer, |
| 829 requireConstant: field.isConst, implicitNull: !field.isConst); |
| 770 } | 830 } |
| 771 | 831 |
| 772 ir.Library getKernelLibrary(KLibrary entity) => | 832 ir.Library getKernelLibrary(KLibrary entity) => |
| 773 _libraryEnvs[entity.libraryIndex].library; | 833 _libraryEnvs[entity.libraryIndex].library; |
| 774 | 834 |
| 775 ir.Class getKernelClass(KClass entity) => _classEnvs[entity.classIndex].cls; | 835 ir.Class getKernelClass(KClass entity) => _classEnvs[entity.classIndex].cls; |
| 776 | 836 |
| 777 bool hasConstantFieldInitializer(covariant KField field) { | 837 bool hasConstantFieldInitializer(covariant KField field) { |
| 778 _FieldData data = _memberList[field.memberIndex]; | 838 FieldData data = _memberList[field.memberIndex]; |
| 779 return getFieldConstantValue(data.node) != null; | 839 return getFieldConstantValue(data.node) != null; |
| 780 } | 840 } |
| 781 | 841 |
| 782 ConstantValue getConstantFieldInitializer(covariant KField field) { | 842 ConstantValue getConstantFieldInitializer(covariant KField field) { |
| 783 _FieldData data = _memberList[field.memberIndex]; | 843 FieldData data = _memberList[field.memberIndex]; |
| 784 ConstantValue value = getFieldConstantValue(data.node); | 844 ConstantValue value = getFieldConstantValue(data.node); |
| 785 assert(value != null, | 845 assert(value != null, |
| 786 failedAt(field, "Field $field doesn't have a constant initial value.")); | 846 failedAt(field, "Field $field doesn't have a constant initial value.")); |
| 787 return value; | 847 return value; |
| 788 } | 848 } |
| 789 | 849 |
| 790 void forEachParameter(covariant KFunction function, | 850 void forEachParameter(covariant KFunction function, |
| 791 void f(DartType type, String name, ConstantValue defaultValue)) { | 851 void f(DartType type, String name, ConstantValue defaultValue)) { |
| 792 _FunctionData data = _memberList[function.memberIndex]; | 852 FunctionData data = _memberList[function.memberIndex]; |
| 793 data.forEachParameter(this, f); | 853 data.forEachParameter(this, f); |
| 794 } | 854 } |
| 795 | 855 |
| 796 ResolutionImpact computeWorldImpact(KMember member) { | |
| 797 return _memberList[member.memberIndex].getWorldImpact(this); | |
| 798 } | |
| 799 | |
| 800 @override | 856 @override |
| 801 Spannable getSpannable(MemberEntity member, ir.Node node) { | 857 Spannable getSpannable(MemberEntity member, ir.Node node) { |
| 802 return member; | 858 return _getSpannable(member, node); |
| 803 } | 859 } |
| 804 | 860 |
| 805 @override | 861 @override |
| 806 ir.Member getMemberNode(covariant KMember member) { | 862 ir.Member getMemberNode(MemberEntity member) { |
| 807 return _memberList[member.memberIndex].node; | 863 return _getMemberNode(member); |
| 808 } | 864 } |
| 809 | 865 |
| 810 /// Returns the kernel IR node that defines the [cls]. | 866 @override |
| 811 ir.Class getClassNode(KClass cls) { | 867 ir.Class getClassNode(ClassEntity cls) { |
| 812 return _classEnvs[cls.classIndex].cls; | 868 return _getClassNode(cls); |
| 813 } | 869 } |
| 814 } | 870 } |
| 815 | 871 |
| 816 /// Environment for fast lookup of program libraries. | 872 /// [KernelToElementMap] implementation used for both world impact computation |
| 817 class _KEnv { | 873 /// and SSA building. |
| 818 final Set<ir.Program> programs = new Set<ir.Program>(); | 874 // TODO(johnniwinther): Remove this when [JsStrategy] is the default. |
| 819 | 875 class KernelToElementMapImpl extends KernelToElementMapForBuildingImpl |
| 820 Map<Uri, _KLibraryEnv> _libraryMap; | 876 with |
| 821 | 877 KernelToElementMapForImpactMixin, |
| 822 /// TODO(johnniwinther): Handle arbitrary load order if needed. | 878 KernelToElementMapForImpactImpl, |
| 823 ir.Member get mainMethod => programs.first?.mainMethod; | 879 KElementCreatorMixin |
| 824 | 880 implements KernelToElementMapForImpactImpl2 { |
| 825 void addProgram(ir.Program program) { | 881 KernelToElementMapImpl(DiagnosticReporter reporter, Environment environment) |
| 826 if (programs.add(program)) { | 882 : super(reporter, environment); |
| 827 if (_libraryMap != null) { | |
| 828 _addLibraries(program); | |
| 829 } | |
| 830 } | |
| 831 } | |
| 832 | |
| 833 void _addLibraries(ir.Program program) { | |
| 834 for (ir.Library library in program.libraries) { | |
| 835 _libraryMap[library.importUri] = new _KLibraryEnv(library); | |
| 836 } | |
| 837 } | |
| 838 | |
| 839 void _ensureLibraryMap() { | |
| 840 if (_libraryMap == null) { | |
| 841 _libraryMap = <Uri, _KLibraryEnv>{}; | |
| 842 for (ir.Program program in programs) { | |
| 843 _addLibraries(program); | |
| 844 } | |
| 845 } | |
| 846 } | |
| 847 | |
| 848 /// Return the [_KLibraryEnv] for the library with the canonical [uri]. | |
| 849 _KLibraryEnv lookupLibrary(Uri uri) { | |
| 850 _ensureLibraryMap(); | |
| 851 return _libraryMap[uri]; | |
| 852 } | |
| 853 | |
| 854 /// Calls [f] for each library in this environment. | |
| 855 void forEachLibrary(void f(_KLibraryEnv library)) { | |
| 856 _ensureLibraryMap(); | |
| 857 _libraryMap.values.forEach(f); | |
| 858 } | |
| 859 | |
| 860 /// Returns the number of libraries in this environment. | |
| 861 int get length { | |
| 862 _ensureLibraryMap(); | |
| 863 return _libraryMap.length; | |
| 864 } | |
| 865 } | |
| 866 | |
| 867 /// Environment for fast lookup of library classes and members. | |
| 868 class _KLibraryEnv { | |
| 869 final ir.Library library; | |
| 870 | |
| 871 Map<String, _KClassEnv> _classMap; | |
| 872 Map<String, ir.Member> _memberMap; | |
| 873 Map<String, ir.Member> _setterMap; | |
| 874 | |
| 875 _KLibraryEnv(this.library); | |
| 876 | |
| 877 void _ensureClassMap() { | |
| 878 if (_classMap == null) { | |
| 879 _classMap = <String, _KClassEnv>{}; | |
| 880 for (ir.Class cls in library.classes) { | |
| 881 _classMap[cls.name] = new _KClassEnv(cls); | |
| 882 } | |
| 883 } | |
| 884 } | |
| 885 | |
| 886 /// Return the [_KClassEnv] for the class [name] in [library]. | |
| 887 _KClassEnv lookupClass(String name) { | |
| 888 _ensureClassMap(); | |
| 889 return _classMap[name]; | |
| 890 } | |
| 891 | |
| 892 /// Calls [f] for each class in this library. | |
| 893 void forEachClass(void f(_KClassEnv cls)) { | |
| 894 _ensureClassMap(); | |
| 895 _classMap.values.forEach(f); | |
| 896 } | |
| 897 | |
| 898 void _ensureMemberMaps() { | |
| 899 if (_memberMap == null) { | |
| 900 _memberMap = <String, ir.Member>{}; | |
| 901 _setterMap = <String, ir.Member>{}; | |
| 902 for (ir.Member member in library.members) { | |
| 903 if (member is ir.Procedure) { | |
| 904 if (member.kind == ir.ProcedureKind.Setter) { | |
| 905 _setterMap[member.name.name] = member; | |
| 906 } else { | |
| 907 _memberMap[member.name.name] = member; | |
| 908 } | |
| 909 } else if (member is ir.Field) { | |
| 910 _memberMap[member.name.name] = member; | |
| 911 if (member.isMutable) { | |
| 912 _setterMap[member.name.name] = member; | |
| 913 } | |
| 914 } else { | |
| 915 throw new SpannableAssertionFailure( | |
| 916 NO_LOCATION_SPANNABLE, "Unexpected library member node: $member"); | |
| 917 } | |
| 918 } | |
| 919 } | |
| 920 } | |
| 921 | |
| 922 /// Return the [ir.Member] for the member [name] in [library]. | |
| 923 ir.Member lookupMember(String name, {bool setter: false}) { | |
| 924 _ensureMemberMaps(); | |
| 925 return setter ? _setterMap[name] : _memberMap[name]; | |
| 926 } | |
| 927 | |
| 928 void forEachMember(void f(ir.Member member)) { | |
| 929 _ensureMemberMaps(); | |
| 930 _memberMap.values.forEach(f); | |
| 931 for (ir.Member member in _setterMap.values) { | |
| 932 if (member is ir.Procedure) { | |
| 933 f(member); | |
| 934 } else { | |
| 935 // Skip fields; these are also in _memberMap. | |
| 936 } | |
| 937 } | |
| 938 } | |
| 939 } | |
| 940 | |
| 941 /// Environment for fast lookup of class members. | |
| 942 class _KClassEnv { | |
| 943 final ir.Class cls; | |
| 944 bool isMixinApplication; | |
| 945 final bool isUnnamedMixinApplication; | |
| 946 | |
| 947 InterfaceType thisType; | |
| 948 InterfaceType rawType; | |
| 949 InterfaceType supertype; | |
| 950 InterfaceType mixedInType; | |
| 951 List<InterfaceType> interfaces; | |
| 952 OrderedTypeSet orderedTypeSet; | |
| 953 | |
| 954 Map<String, ir.Member> _constructorMap; | |
| 955 Map<String, ir.Member> _memberMap; | |
| 956 Map<String, ir.Member> _setterMap; | |
| 957 | |
| 958 Iterable<ConstantValue> _metadata; | |
| 959 | |
| 960 _KClassEnv(this.cls) | |
| 961 // TODO(johnniwinther): Change this to use a property on [cls] when such | |
| 962 // is added to kernel. | |
| 963 : isUnnamedMixinApplication = | |
| 964 cls.name.contains('+') || cls.name.contains('&'); | |
| 965 | |
| 966 /// Copied from 'package:kernel/transformations/mixin_full_resolution.dart'. | |
| 967 ir.Constructor _buildForwardingConstructor( | |
| 968 CloneVisitor cloner, ir.Constructor superclassConstructor) { | |
| 969 var superFunction = superclassConstructor.function; | |
| 970 | |
| 971 // We keep types and default values for the parameters but always mark the | |
| 972 // parameters as final (since we just forward them to the super | |
| 973 // constructor). | |
| 974 ir.VariableDeclaration cloneVariable(ir.VariableDeclaration variable) { | |
| 975 ir.VariableDeclaration clone = cloner.clone(variable); | |
| 976 clone.isFinal = true; | |
| 977 return clone; | |
| 978 } | |
| 979 | |
| 980 // Build a [FunctionNode] which has the same parameters as the one in the | |
| 981 // superclass constructor. | |
| 982 var positionalParameters = | |
| 983 superFunction.positionalParameters.map(cloneVariable).toList(); | |
| 984 var namedParameters = | |
| 985 superFunction.namedParameters.map(cloneVariable).toList(); | |
| 986 var function = new ir.FunctionNode(new ir.EmptyStatement(), | |
| 987 positionalParameters: positionalParameters, | |
| 988 namedParameters: namedParameters, | |
| 989 requiredParameterCount: superFunction.requiredParameterCount, | |
| 990 returnType: const ir.VoidType()); | |
| 991 | |
| 992 // Build a [SuperInitializer] which takes all positional/named parameters | |
| 993 // and forward them to the super class constructor. | |
| 994 var positionalArguments = <ir.Expression>[]; | |
| 995 for (var variable in positionalParameters) { | |
| 996 positionalArguments.add(new ir.VariableGet(variable)); | |
| 997 } | |
| 998 var namedArguments = <ir.NamedExpression>[]; | |
| 999 for (var variable in namedParameters) { | |
| 1000 namedArguments.add( | |
| 1001 new ir.NamedExpression(variable.name, new ir.VariableGet(variable))); | |
| 1002 } | |
| 1003 var superInitializer = new ir.SuperInitializer(superclassConstructor, | |
| 1004 new ir.Arguments(positionalArguments, named: namedArguments)); | |
| 1005 | |
| 1006 // Assemble the constructor. | |
| 1007 return new ir.Constructor(function, | |
| 1008 name: superclassConstructor.name, | |
| 1009 initializers: <ir.Initializer>[superInitializer]); | |
| 1010 } | |
| 1011 | |
| 1012 void _ensureMaps() { | |
| 1013 if (_memberMap == null) { | |
| 1014 _memberMap = <String, ir.Member>{}; | |
| 1015 _setterMap = <String, ir.Member>{}; | |
| 1016 _constructorMap = <String, ir.Member>{}; | |
| 1017 | |
| 1018 void addMembers(ir.Class c, {bool includeStatic}) { | |
| 1019 for (ir.Member member in c.members) { | |
| 1020 if (member is ir.Constructor || | |
| 1021 member is ir.Procedure && | |
| 1022 member.kind == ir.ProcedureKind.Factory) { | |
| 1023 if (!includeStatic) continue; | |
| 1024 _constructorMap[member.name.name] = member; | |
| 1025 } else if (member is ir.Procedure) { | |
| 1026 if (!includeStatic && member.isStatic) continue; | |
| 1027 if (member.kind == ir.ProcedureKind.Setter) { | |
| 1028 _setterMap[member.name.name] = member; | |
| 1029 } else { | |
| 1030 _memberMap[member.name.name] = member; | |
| 1031 } | |
| 1032 } else if (member is ir.Field) { | |
| 1033 if (!includeStatic && member.isStatic) continue; | |
| 1034 _memberMap[member.name.name] = member; | |
| 1035 if (member.isMutable) { | |
| 1036 _setterMap[member.name.name] = member; | |
| 1037 } | |
| 1038 _memberMap[member.name.name] = member; | |
| 1039 } else { | |
| 1040 throw new SpannableAssertionFailure( | |
| 1041 NO_LOCATION_SPANNABLE, "Unexpected class member node: $member"); | |
| 1042 } | |
| 1043 } | |
| 1044 } | |
| 1045 | |
| 1046 if (cls.mixedInClass != null) { | |
| 1047 addMembers(cls.mixedInClass, includeStatic: false); | |
| 1048 } | |
| 1049 addMembers(cls, includeStatic: true); | |
| 1050 | |
| 1051 if (isUnnamedMixinApplication && _constructorMap.isEmpty) { | |
| 1052 // Unnamed mixin applications have no constructors when read from .dill. | |
| 1053 // For each generative constructor in the superclass we make a | |
| 1054 // corresponding forwarding constructor in the subclass. | |
| 1055 // | |
| 1056 // This code is copied from | |
| 1057 // 'package:kernel/transformations/mixin_full_resolution.dart' | |
| 1058 var superclassSubstitution = getSubstitutionMap(cls.supertype); | |
| 1059 var superclassCloner = | |
| 1060 new CloneVisitor(typeSubstitution: superclassSubstitution); | |
| 1061 for (var superclassConstructor in cls.superclass.constructors) { | |
| 1062 var forwardingConstructor = _buildForwardingConstructor( | |
| 1063 superclassCloner, superclassConstructor); | |
| 1064 cls.addMember(forwardingConstructor); | |
| 1065 _constructorMap[forwardingConstructor.name.name] = | |
| 1066 forwardingConstructor; | |
| 1067 } | |
| 1068 } | |
| 1069 } | |
| 1070 } | |
| 1071 | |
| 1072 /// Return the [ir.Member] for the member [name] in [library]. | |
| 1073 ir.Member lookupMember(String name, {bool setter: false}) { | |
| 1074 _ensureMaps(); | |
| 1075 return setter ? _setterMap[name] : _memberMap[name]; | |
| 1076 } | |
| 1077 | |
| 1078 /// Return the [ir.Member] for the member [name] in [library]. | |
| 1079 ir.Member lookupConstructor(String name) { | |
| 1080 _ensureMaps(); | |
| 1081 return _constructorMap[name]; | |
| 1082 } | |
| 1083 | |
| 1084 void forEachMember(void f(ir.Member member)) { | |
| 1085 _ensureMaps(); | |
| 1086 _memberMap.values.forEach(f); | |
| 1087 for (ir.Member member in _setterMap.values) { | |
| 1088 if (member is ir.Procedure) { | |
| 1089 f(member); | |
| 1090 } else { | |
| 1091 // Skip fields; these are also in _memberMap. | |
| 1092 } | |
| 1093 } | |
| 1094 } | |
| 1095 | |
| 1096 void forEachConstructor(void f(ir.Member member)) { | |
| 1097 _ensureMaps(); | |
| 1098 _constructorMap.values.forEach(f); | |
| 1099 } | |
| 1100 | |
| 1101 Iterable<ConstantValue> getMetadata(KernelToElementMapImpl elementMap) { | |
| 1102 return _metadata ??= elementMap.getMetadata(cls.annotations); | |
| 1103 } | |
| 1104 } | |
| 1105 | |
| 1106 class _MemberData { | |
| 1107 final ir.Member node; | |
| 1108 Iterable<ConstantValue> _metadata; | |
| 1109 | |
| 1110 _MemberData(this.node); | |
| 1111 | |
| 1112 ResolutionImpact getWorldImpact(KernelToElementMapImpl elementMap) { | |
| 1113 return buildKernelImpact(node, elementMap); | |
| 1114 } | |
| 1115 | |
| 1116 Iterable<ConstantValue> getMetadata(KernelToElementMapImpl elementMap) { | |
| 1117 return _metadata ??= elementMap.getMetadata(node.annotations); | |
| 1118 } | |
| 1119 } | |
| 1120 | |
| 1121 class _FunctionData extends _MemberData { | |
| 1122 final ir.FunctionNode functionNode; | |
| 1123 FunctionType _type; | |
| 1124 | |
| 1125 _FunctionData(ir.Member node, this.functionNode) : super(node); | |
| 1126 | |
| 1127 FunctionType getFunctionType(KernelToElementMapImpl elementMap) { | |
| 1128 return _type ??= elementMap.getFunctionType(functionNode); | |
| 1129 } | |
| 1130 | |
| 1131 void forEachParameter(KernelToElementMapForBuilding elementMap, | |
| 1132 void f(DartType type, String name, ConstantValue defaultValue)) { | |
| 1133 void handleParameter(ir.VariableDeclaration node, {bool isOptional: true}) { | |
| 1134 DartType type = elementMap.getDartType(node.type); | |
| 1135 String name = node.name; | |
| 1136 ConstantValue defaultValue; | |
| 1137 if (isOptional) { | |
| 1138 if (node.initializer != null) { | |
| 1139 defaultValue = elementMap.getConstantValue(node.initializer); | |
| 1140 } else { | |
| 1141 defaultValue = new NullConstantValue(); | |
| 1142 } | |
| 1143 } | |
| 1144 f(type, name, defaultValue); | |
| 1145 } | |
| 1146 | |
| 1147 for (int i = 0; i < functionNode.positionalParameters.length; i++) { | |
| 1148 handleParameter(functionNode.positionalParameters[i], | |
| 1149 isOptional: i < functionNode.requiredParameterCount); | |
| 1150 } | |
| 1151 functionNode.namedParameters.toList() | |
| 1152 ..sort(namedOrdering) | |
| 1153 ..forEach(handleParameter); | |
| 1154 } | |
| 1155 } | |
| 1156 | |
| 1157 class _ConstructorData extends _FunctionData { | |
| 1158 ConstantConstructor _constantConstructor; | |
| 1159 | |
| 1160 _ConstructorData(ir.Member node, ir.FunctionNode functionNode) | |
| 1161 : super(node, functionNode); | |
| 1162 | |
| 1163 ConstantConstructor getConstructorConstant( | |
| 1164 KernelToElementMapImpl elementMap, KConstructor constructor) { | |
| 1165 if (_constantConstructor == null) { | |
| 1166 if (node is ir.Constructor && constructor.isConst) { | |
| 1167 _constantConstructor = | |
| 1168 new Constantifier(elementMap).computeConstantConstructor(node); | |
| 1169 } else { | |
| 1170 throw new SpannableAssertionFailure( | |
| 1171 constructor, | |
| 1172 "Unexpected constructor $constructor in " | |
| 1173 "KernelWorldBuilder._getConstructorConstant"); | |
| 1174 } | |
| 1175 } | |
| 1176 return _constantConstructor; | |
| 1177 } | |
| 1178 } | |
| 1179 | |
| 1180 class _FieldData extends _MemberData { | |
| 1181 ConstantExpression _constant; | |
| 1182 | |
| 1183 _FieldData(ir.Field node) : super(node); | |
| 1184 | |
| 1185 ir.Field get node => super.node; | |
| 1186 | |
| 1187 ConstantExpression getFieldConstant( | |
| 1188 KernelToElementMapImpl elementMap, KField field) { | |
| 1189 if (_constant == null) { | |
| 1190 if (node.isConst) { | |
| 1191 _constant = new Constantifier(elementMap).visit(node.initializer); | |
| 1192 } else { | |
| 1193 throw new SpannableAssertionFailure( | |
| 1194 field, | |
| 1195 "Unexpected field $field in " | |
| 1196 "KernelWorldBuilder._getConstructorConstant"); | |
| 1197 } | |
| 1198 } | |
| 1199 return _constant; | |
| 1200 } | |
| 1201 } | 883 } |
| 1202 | 884 |
| 1203 class KernelElementEnvironment implements ElementEnvironment { | 885 class KernelElementEnvironment implements ElementEnvironment { |
| 1204 final KernelToElementMapBase elementMap; | 886 final KernelToElementMapBase elementMap; |
| 1205 | 887 |
| 1206 KernelElementEnvironment(this.elementMap); | 888 KernelElementEnvironment(this.elementMap); |
| 1207 | 889 |
| 1208 @override | 890 @override |
| 1209 DartType get dynamicType => const DynamicType(); | 891 DartType get dynamicType => const DynamicType(); |
| 1210 | 892 |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1386 } | 1068 } |
| 1387 | 1069 |
| 1388 @override | 1070 @override |
| 1389 bool isDeferredLoadLibraryGetter(covariant KMember member) { | 1071 bool isDeferredLoadLibraryGetter(covariant KMember member) { |
| 1390 // TODO(redemption): Support these. | 1072 // TODO(redemption): Support these. |
| 1391 return false; | 1073 return false; |
| 1392 } | 1074 } |
| 1393 | 1075 |
| 1394 @override | 1076 @override |
| 1395 Iterable<ConstantValue> getMemberMetadata(covariant KMember member) { | 1077 Iterable<ConstantValue> getMemberMetadata(covariant KMember member) { |
| 1396 _MemberData memberData = elementMap._memberList[member.memberIndex]; | 1078 MemberData memberData = elementMap._memberList[member.memberIndex]; |
| 1397 return memberData.getMetadata(elementMap); | 1079 return memberData.getMetadata(elementMap); |
| 1398 } | 1080 } |
| 1399 } | 1081 } |
| 1400 | 1082 |
| 1401 /// Visitor that converts kernel dart types into [DartType]. | 1083 /// Visitor that converts kernel dart types into [DartType]. |
| 1402 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { | 1084 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { |
| 1403 final KernelToElementMapBase elementMap; | 1085 final KernelToElementMapBase elementMap; |
| 1404 bool topLevel = true; | 1086 bool topLevel = true; |
| 1405 | 1087 |
| 1406 DartTypeConverter(this.elementMap); | 1088 DartTypeConverter(this.elementMap); |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1559 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant"); | 1241 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant"); |
| 1560 } | 1242 } |
| 1561 | 1243 |
| 1562 @override | 1244 @override |
| 1563 String readFromEnvironment(String name) { | 1245 String readFromEnvironment(String name) { |
| 1564 return _environment.valueOf(name); | 1246 return _environment.valueOf(name); |
| 1565 } | 1247 } |
| 1566 } | 1248 } |
| 1567 | 1249 |
| 1568 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { | 1250 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { |
| 1569 final KernelToElementMapImpl elementMap; | 1251 final KernelToElementMapForImpactImpl elementMap; |
| 1570 | 1252 |
| 1571 KernelResolutionWorldBuilder( | 1253 KernelResolutionWorldBuilder( |
| 1572 this.elementMap, | 1254 this.elementMap, |
| 1573 NativeBasicData nativeBasicData, | 1255 NativeBasicData nativeBasicData, |
| 1574 NativeDataBuilder nativeDataBuilder, | 1256 NativeDataBuilder nativeDataBuilder, |
| 1575 InterceptorDataBuilder interceptorDataBuilder, | 1257 InterceptorDataBuilder interceptorDataBuilder, |
| 1576 BackendUsageBuilder backendUsageBuilder, | 1258 BackendUsageBuilder backendUsageBuilder, |
| 1577 SelectorConstraintsStrategy selectorConstraintsStrategy) | 1259 SelectorConstraintsStrategy selectorConstraintsStrategy) |
| 1578 : super( | 1260 : super( |
| 1579 elementMap.elementEnvironment, | 1261 elementMap.elementEnvironment, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1613 } | 1295 } |
| 1614 | 1296 |
| 1615 @override | 1297 @override |
| 1616 bool validateClass(ClassEntity cls) => true; | 1298 bool validateClass(ClassEntity cls) => true; |
| 1617 | 1299 |
| 1618 @override | 1300 @override |
| 1619 bool checkClass(ClassEntity cls) => true; | 1301 bool checkClass(ClassEntity cls) => true; |
| 1620 } | 1302 } |
| 1621 | 1303 |
| 1622 class KernelClosedWorld extends ClosedWorldBase { | 1304 class KernelClosedWorld extends ClosedWorldBase { |
| 1623 final KernelToElementMapImpl _elementMap; | 1305 final KernelToElementMapForImpactImpl _elementMap; |
| 1624 | 1306 |
| 1625 KernelClosedWorld(this._elementMap, | 1307 KernelClosedWorld(this._elementMap, |
| 1626 {ElementEnvironment elementEnvironment, | 1308 {ElementEnvironment elementEnvironment, |
| 1627 DartTypes dartTypes, | 1309 DartTypes dartTypes, |
| 1628 CommonElements commonElements, | 1310 CommonElements commonElements, |
| 1629 ConstantSystem constantSystem, | 1311 ConstantSystem constantSystem, |
| 1630 NativeData nativeData, | 1312 NativeData nativeData, |
| 1631 InterceptorData interceptorData, | 1313 InterceptorData interceptorData, |
| 1632 BackendUsage backendUsage, | 1314 BackendUsage backendUsage, |
| 1633 ResolutionWorldBuilder resolutionWorldBuilder, | 1315 ResolutionWorldBuilder resolutionWorldBuilder, |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1717 return member == element; | 1399 return member == element; |
| 1718 } | 1400 } |
| 1719 cls = elementEnvironment.getSuperClass(cls); | 1401 cls = elementEnvironment.getSuperClass(cls); |
| 1720 } | 1402 } |
| 1721 return false; | 1403 return false; |
| 1722 } | 1404 } |
| 1723 } | 1405 } |
| 1724 | 1406 |
| 1725 // Interface for testing equivalence of Kernel-based entities. | 1407 // Interface for testing equivalence of Kernel-based entities. |
| 1726 class WorldDeconstructionForTesting { | 1408 class WorldDeconstructionForTesting { |
| 1727 final KernelToElementMapImpl elementMap; | 1409 final KernelToElementMapBase elementMap; |
| 1728 | 1410 |
| 1729 WorldDeconstructionForTesting(this.elementMap); | 1411 WorldDeconstructionForTesting(this.elementMap); |
| 1730 | 1412 |
| 1731 KClass getSuperclassForClass(KClass cls) { | 1413 KClass getSuperclassForClass(KClass cls) { |
| 1732 _KClassEnv env = elementMap._classEnvs[cls.classIndex]; | 1414 ClassEnv env = elementMap._classEnvs[cls.classIndex]; |
| 1733 ir.Supertype supertype = env.cls.supertype; | 1415 ir.Supertype supertype = env.cls.supertype; |
| 1734 if (supertype == null) return null; | 1416 if (supertype == null) return null; |
| 1735 return elementMap.getClass(supertype.classNode); | 1417 return elementMap.getClass(supertype.classNode); |
| 1736 } | 1418 } |
| 1737 | 1419 |
| 1738 bool isUnnamedMixinApplication(KClass cls) { | 1420 bool isUnnamedMixinApplication(KClass cls) { |
| 1739 return elementMap._isUnnamedMixinApplication(cls); | 1421 return elementMap._isUnnamedMixinApplication(cls); |
| 1740 } | 1422 } |
| 1741 | 1423 |
| 1742 InterfaceType getMixinTypeForClass(KClass cls) { | 1424 InterfaceType getMixinTypeForClass(KClass cls) { |
| 1743 _KClassEnv env = elementMap._classEnvs[cls.classIndex]; | 1425 ClassEnv env = elementMap._classEnvs[cls.classIndex]; |
| 1744 ir.Supertype mixedInType = env.cls.mixedInType; | 1426 ir.Supertype mixedInType = env.cls.mixedInType; |
| 1745 if (mixedInType == null) return null; | 1427 if (mixedInType == null) return null; |
| 1746 return elementMap.createInterfaceType( | 1428 return elementMap.createInterfaceType( |
| 1747 mixedInType.classNode, mixedInType.typeArguments); | 1429 mixedInType.classNode, mixedInType.typeArguments); |
| 1748 } | 1430 } |
| 1749 } | 1431 } |
| 1750 | 1432 |
| 1751 class KernelNativeMemberResolver extends NativeMemberResolverBase { | 1433 class KernelNativeMemberResolver extends NativeMemberResolverBase { |
| 1752 final KernelToElementMapImpl elementMap; | 1434 final KernelToElementMapForImpactImpl elementMap; |
| 1753 final NativeBasicData nativeBasicData; | 1435 final NativeBasicData nativeBasicData; |
| 1754 final NativeDataBuilder nativeDataBuilder; | 1436 final NativeDataBuilder nativeDataBuilder; |
| 1755 | 1437 |
| 1756 KernelNativeMemberResolver( | 1438 KernelNativeMemberResolver( |
| 1757 this.elementMap, this.nativeBasicData, this.nativeDataBuilder); | 1439 this.elementMap, this.nativeBasicData, this.nativeDataBuilder); |
| 1758 | 1440 |
| 1759 @override | 1441 @override |
| 1760 ElementEnvironment get elementEnvironment => elementMap.elementEnvironment; | 1442 ElementEnvironment get elementEnvironment => elementMap.elementEnvironment; |
| 1761 | 1443 |
| 1762 @override | 1444 @override |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1800 return false; | 1482 return false; |
| 1801 } | 1483 } |
| 1802 } | 1484 } |
| 1803 | 1485 |
| 1804 class JsKernelToElementMap extends KernelToElementMapBase | 1486 class JsKernelToElementMap extends KernelToElementMapBase |
| 1805 with KernelToElementMapForBuildingMixin | 1487 with KernelToElementMapForBuildingMixin |
| 1806 implements KernelToWorldBuilder { | 1488 implements KernelToWorldBuilder { |
| 1807 final JsToFrontendMap _map; | 1489 final JsToFrontendMap _map; |
| 1808 final ElementEnvironment _elementEnvironment; | 1490 final ElementEnvironment _elementEnvironment; |
| 1809 final CommonElements _commonElements; | 1491 final CommonElements _commonElements; |
| 1810 final KernelToElementMapImpl _elementMap; | 1492 final KernelToElementMapForImpactImpl _elementMap; |
| 1811 | 1493 |
| 1812 JsKernelToElementMap( | 1494 JsKernelToElementMap( |
| 1813 DiagnosticReporter reporter, | 1495 DiagnosticReporter reporter, |
| 1814 Environment environment, | 1496 Environment environment, |
| 1815 this._map, | 1497 this._map, |
| 1816 this._elementEnvironment, | 1498 this._elementEnvironment, |
| 1817 this._commonElements, | 1499 this._commonElements, |
| 1818 this._elementMap) | 1500 this._elementMap) |
| 1819 : super(reporter, environment); | 1501 : super(reporter, environment); |
| 1820 | 1502 |
| 1821 @override | 1503 @override |
| 1822 Spannable getSpannable(MemberEntity member, ir.Node node) { | 1504 Spannable getSpannable(MemberEntity member, ir.Node node) { |
| 1823 return _elementMap.getSpannable(_map.toFrontendMember(member), node); | 1505 return _elementMap._getSpannable(_map.toFrontendMember(member), node); |
| 1506 } |
| 1507 |
| 1508 Iterable<LibraryEntity> get _libraries { |
| 1509 return _elementMap._libraries.map(_map.toBackendLibrary); |
| 1824 } | 1510 } |
| 1825 | 1511 |
| 1826 @override | 1512 @override |
| 1827 LibraryEntity getLibrary(ir.Library node) { | 1513 LibraryEntity _getLibrary(ir.Library node, [LibraryEnv env]) { |
| 1828 return _map.toBackendLibrary(_elementMap.getLibrary(node)); | 1514 return _map.toBackendLibrary(_elementMap.getLibrary(node)); |
| 1829 } | 1515 } |
| 1830 | 1516 |
| 1831 @override | 1517 @override |
| 1832 Local getLocalFunction(ir.TreeNode node) { | 1518 Local _getLocalFunction(ir.TreeNode node) { |
| 1833 throw new UnsupportedError("JsKernelToElementMap.getLocalFunction"); | 1519 throw new UnsupportedError("JsKernelToElementMap.getLocalFunction"); |
| 1834 } | 1520 } |
| 1835 | 1521 |
| 1836 @override | 1522 @override |
| 1837 ClassEntity getClass(ir.Class node) { | 1523 ClassEntity _getClass(ir.Class node, [ClassEnv env]) { |
| 1838 return _map.toBackendClass(_elementMap.getClass(node)); | 1524 return _map.toBackendClass(_elementMap.getClass(node)); |
| 1839 } | 1525 } |
| 1840 | 1526 |
| 1841 @override | 1527 @override |
| 1842 FieldEntity getField(ir.Field node) { | 1528 TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { |
| 1529 throw new UnsupportedError("JsKernelToElementMap._getTypeVariable"); |
| 1530 } |
| 1531 |
| 1532 @override |
| 1533 FieldEntity _getField(ir.Field node) { |
| 1843 return _map.toBackendMember(_elementMap.getField(node)); | 1534 return _map.toBackendMember(_elementMap.getField(node)); |
| 1844 } | 1535 } |
| 1845 | 1536 |
| 1846 @override | 1537 @override |
| 1847 MemberEntity getSuperMember(ir.Member context, ir.Name name, ir.Member target, | 1538 FunctionEntity _getMethod(ir.Procedure node) { |
| 1848 {bool setter: false}) { | |
| 1849 return _map.toBackendMember( | |
| 1850 _elementMap.getSuperMember(context, name, target, setter: setter)); | |
| 1851 } | |
| 1852 | |
| 1853 @override | |
| 1854 FunctionEntity getMethod(ir.Procedure node) { | |
| 1855 return _map.toBackendMember(_elementMap.getMethod(node)); | 1539 return _map.toBackendMember(_elementMap.getMethod(node)); |
| 1856 } | 1540 } |
| 1857 | 1541 |
| 1858 @override | 1542 @override |
| 1859 ir.Member getMemberNode(MemberEntity member) { | 1543 ConstructorEntity _getConstructor(ir.Member node) { |
| 1860 return _elementMap.getMemberNode(_map.toFrontendMember(member)); | |
| 1861 } | |
| 1862 | |
| 1863 @override | |
| 1864 MemberEntity getMember(ir.Member node) { | |
| 1865 return _map.toBackendMember(_elementMap.getMember(node)); | |
| 1866 } | |
| 1867 | |
| 1868 @override | |
| 1869 ConstructorEntity getConstructor(ir.Member node) { | |
| 1870 return _map.toBackendMember(_elementMap.getConstructor(node)); | 1544 return _map.toBackendMember(_elementMap.getConstructor(node)); |
| 1871 } | 1545 } |
| 1872 | 1546 |
| 1873 @override | 1547 @override |
| 1548 ir.Member getMemberNode(MemberEntity member) { |
| 1549 return _elementMap._getMemberNode(_map.toFrontendMember(member)); |
| 1550 } |
| 1551 |
| 1552 @override |
| 1553 ir.Class getClassNode(ClassEntity cls) { |
| 1554 return _elementMap._getClassNode(_map.toFrontendClass(cls)); |
| 1555 } |
| 1556 |
| 1557 @override |
| 1874 InterfaceType createInterfaceType( | 1558 InterfaceType createInterfaceType( |
| 1875 ir.Class cls, List<ir.DartType> typeArguments) { | 1559 ir.Class cls, List<ir.DartType> typeArguments) { |
| 1876 return _map | 1560 return _map |
| 1877 .toBackendType(_elementMap.createInterfaceType(cls, typeArguments)); | 1561 .toBackendType(_elementMap.createInterfaceType(cls, typeArguments)); |
| 1878 } | 1562 } |
| 1879 | 1563 |
| 1880 @override | 1564 @override |
| 1881 InterfaceType getInterfaceType(ir.InterfaceType type) { | 1565 InterfaceType getInterfaceType(ir.InterfaceType type) { |
| 1882 return _map.toBackendType(_elementMap.getInterfaceType(type)); | 1566 return _map.toBackendType(_elementMap.getInterfaceType(type)); |
| 1883 } | 1567 } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1934 throw new UnsupportedError( | 1618 throw new UnsupportedError( |
| 1935 "JsKernelToElementMap.getConstantFieldInitializer"); | 1619 "JsKernelToElementMap.getConstantFieldInitializer"); |
| 1936 } | 1620 } |
| 1937 | 1621 |
| 1938 @override | 1622 @override |
| 1939 bool hasConstantFieldInitializer(FieldEntity field) { | 1623 bool hasConstantFieldInitializer(FieldEntity field) { |
| 1940 throw new UnsupportedError( | 1624 throw new UnsupportedError( |
| 1941 "JsKernelToElementMap.hasConstantFieldInitializer"); | 1625 "JsKernelToElementMap.hasConstantFieldInitializer"); |
| 1942 } | 1626 } |
| 1943 } | 1627 } |
| OLD | NEW |