| 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.world_builder; | 5 library dart2js.kernel.element_map; |
| 6 | 6 |
| 7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
| 8 | 8 |
| 9 import '../common.dart'; | 9 import '../common.dart'; |
| 10 import '../common/resolution.dart'; | 10 import '../common/resolution.dart'; |
| 11 import '../compile_time_constants.dart'; | 11 import '../compile_time_constants.dart'; |
| 12 import '../constants/constant_system.dart'; | 12 import '../constants/constant_system.dart'; |
| 13 import '../constants/constructors.dart'; | 13 import '../constants/constructors.dart'; |
| 14 import '../constants/evaluation.dart'; | 14 import '../constants/evaluation.dart'; |
| 15 import '../constants/expressions.dart'; | 15 import '../constants/expressions.dart'; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 29 import '../universe/world_builder.dart'; | 29 import '../universe/world_builder.dart'; |
| 30 import '../util/util.dart' show Link, LinkBuilder; | 30 import '../util/util.dart' show Link, LinkBuilder; |
| 31 import 'element_adapter.dart'; | 31 import 'element_adapter.dart'; |
| 32 import 'elements.dart'; | 32 import 'elements.dart'; |
| 33 | 33 |
| 34 part 'native_basic_data.dart'; | 34 part 'native_basic_data.dart'; |
| 35 part 'native_class_resolver.dart'; | 35 part 'native_class_resolver.dart'; |
| 36 part 'no_such_method_resolver.dart'; | 36 part 'no_such_method_resolver.dart'; |
| 37 part 'types.dart'; | 37 part 'types.dart'; |
| 38 | 38 |
| 39 /// World builder used for creating elements and types corresponding to Kernel | 39 /// Element builder used for creating elements and types corresponding to Kernel |
| 40 /// IR nodes. | 40 /// IR nodes. |
| 41 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. | 41 class KernelToElementMap extends KernelElementAdapterMixin { |
| 42 class KernelWorldBuilder extends KernelElementAdapterMixin { | |
| 43 CommonElements _commonElements; | 42 CommonElements _commonElements; |
| 44 native.BehaviorBuilder _nativeBehaviorBuilder; | 43 native.BehaviorBuilder _nativeBehaviorBuilder; |
| 45 final DiagnosticReporter reporter; | 44 final DiagnosticReporter reporter; |
| 46 ElementEnvironment _elementEnvironment; | 45 ElementEnvironment _elementEnvironment; |
| 47 DartTypeConverter _typeConverter; | 46 DartTypeConverter _typeConverter; |
| 48 KernelConstantEnvironment _constantEnvironment; | 47 KernelConstantEnvironment _constantEnvironment; |
| 49 _KernelDartTypes _types; | 48 _KernelDartTypes _types; |
| 50 | 49 |
| 51 /// Library environment. Used for fast lookup. | 50 /// Library environment. Used for fast lookup. |
| 52 KEnv _env; | 51 _KEnv _env; |
| 53 | 52 |
| 54 /// List of library environments by `KLibrary.libraryIndex`. This is used for | 53 /// List of library environments by `KLibrary.libraryIndex`. This is used for |
| 55 /// fast lookup into library classes and members. | 54 /// fast lookup into library classes and members. |
| 56 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[]; | 55 List<_KLibraryEnv> _libraryEnvs = <_KLibraryEnv>[]; |
| 57 | 56 |
| 58 /// List of class environments by `KClass.classIndex`. This is used for | 57 /// List of class environments by `KClass.classIndex`. This is used for |
| 59 /// fast lookup into class members. | 58 /// fast lookup into class members. |
| 60 List<KClassEnv> _classEnvs = <KClassEnv>[]; | 59 List<_KClassEnv> _classEnvs = <_KClassEnv>[]; |
| 61 | 60 |
| 62 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; | 61 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; |
| 63 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; | 62 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; |
| 64 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = | 63 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = |
| 65 <ir.TypeParameter, KTypeVariable>{}; | 64 <ir.TypeParameter, KTypeVariable>{}; |
| 66 | 65 |
| 67 // TODO(johnniwinther): Change this to a list of 'KMemberData' class if we | 66 // TODO(johnniwinther): Change this to a list of 'KMemberData' class if we |
| 68 // need more data for members. | 67 // need more data for members. |
| 69 List<ir.Member> _memberList = <ir.Member>[]; | 68 List<ir.Member> _memberList = <ir.Member>[]; |
| 70 | 69 |
| 71 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; | 70 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; |
| 72 Map<KConstructor, ConstantConstructor> _constructorConstantMap = | 71 Map<KConstructor, ConstantConstructor> _constructorConstantMap = |
| 73 <KConstructor, ConstantConstructor>{}; | 72 <KConstructor, ConstantConstructor>{}; |
| 74 | 73 |
| 75 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; | 74 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; |
| 76 | 75 |
| 77 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; | 76 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; |
| 78 Map<KField, ConstantExpression> _fieldConstantMap = | 77 Map<KField, ConstantExpression> _fieldConstantMap = |
| 79 <KField, ConstantExpression>{}; | 78 <KField, ConstantExpression>{}; |
| 80 | 79 |
| 81 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = | 80 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = |
| 82 <ir.TreeNode, KLocalFunction>{}; | 81 <ir.TreeNode, KLocalFunction>{}; |
| 83 | 82 |
| 84 KernelWorldBuilder(this.reporter, ir.Program program) | 83 KernelToElementMap(this.reporter, ir.Program program) |
| 85 : _env = new KEnv(program) { | 84 : _env = new _KEnv(program) { |
| 86 _elementEnvironment = new KernelElementEnvironment(this); | 85 _elementEnvironment = new KernelElementEnvironment(this); |
| 87 _commonElements = new CommonElements(_elementEnvironment); | 86 _commonElements = new CommonElements(_elementEnvironment); |
| 88 _constantEnvironment = new KernelConstantEnvironment(this); | 87 _constantEnvironment = new KernelConstantEnvironment(this); |
| 89 _nativeBehaviorBuilder = | 88 _nativeBehaviorBuilder = |
| 90 new KernelBehaviorBuilder(_commonElements, _constantEnvironment); | 89 new KernelBehaviorBuilder(_commonElements, _constantEnvironment); |
| 91 _types = new _KernelDartTypes(this); | 90 _types = new _KernelDartTypes(this); |
| 92 _typeConverter = new DartTypeConverter(this); | 91 _typeConverter = new DartTypeConverter(this); |
| 93 } | 92 } |
| 94 | 93 |
| 95 KMethod get _mainFunction { | 94 KMethod get _mainFunction { |
| 96 return _env.program.mainMethod != null | 95 return _env.program.mainMethod != null |
| 97 ? _getMethod(_env.program.mainMethod) | 96 ? _getMethod(_env.program.mainMethod) |
| 98 : null; | 97 : null; |
| 99 } | 98 } |
| 100 | 99 |
| 101 KLibrary get _mainLibrary { | 100 KLibrary get _mainLibrary { |
| 102 return _env.program.mainMethod != null | 101 return _env.program.mainMethod != null |
| 103 ? _getLibrary(_env.program.mainMethod.enclosingLibrary) | 102 ? _getLibrary(_env.program.mainMethod.enclosingLibrary) |
| 104 : null; | 103 : null; |
| 105 } | 104 } |
| 106 | 105 |
| 107 Iterable<LibraryEntity> get _libraries { | 106 Iterable<LibraryEntity> get _libraries { |
| 108 if (_env.length != _libraryMap.length) { | 107 if (_env.length != _libraryMap.length) { |
| 109 // Create a [KLibrary] for each library. | 108 // Create a [KLibrary] for each library. |
| 110 _env.forEachLibrary((KLibraryEnv env) { | 109 _env.forEachLibrary((_KLibraryEnv env) { |
| 111 _getLibrary(env.library, env); | 110 _getLibrary(env.library, env); |
| 112 }); | 111 }); |
| 113 } | 112 } |
| 114 return _libraryMap.values; | 113 return _libraryMap.values; |
| 115 } | 114 } |
| 116 | 115 |
| 117 @override | 116 @override |
| 118 CommonElements get commonElements => _commonElements; | 117 CommonElements get commonElements => _commonElements; |
| 119 | 118 |
| 120 @override | 119 @override |
| 121 ElementEnvironment get elementEnvironment => _elementEnvironment; | 120 ElementEnvironment get elementEnvironment => _elementEnvironment; |
| 122 | 121 |
| 123 ConstantEnvironment get constantEnvironment => _constantEnvironment; | 122 ConstantEnvironment get constantEnvironment => _constantEnvironment; |
| 124 | 123 |
| 125 DartTypes get types => _types; | 124 DartTypes get types => _types; |
| 126 | 125 |
| 127 @override | 126 @override |
| 128 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder; | 127 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder; |
| 129 | 128 |
| 130 LibraryEntity lookupLibrary(Uri uri) { | 129 LibraryEntity lookupLibrary(Uri uri) { |
| 131 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); | 130 _KLibraryEnv libraryEnv = _env.lookupLibrary(uri); |
| 132 return _getLibrary(libraryEnv.library, libraryEnv); | 131 return _getLibrary(libraryEnv.library, libraryEnv); |
| 133 } | 132 } |
| 134 | 133 |
| 135 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { | 134 KLibrary _getLibrary(ir.Library node, [_KLibraryEnv libraryEnv]) { |
| 136 return _libraryMap.putIfAbsent(node, () { | 135 return _libraryMap.putIfAbsent(node, () { |
| 137 Uri canonicalUri = node.importUri; | 136 Uri canonicalUri = node.importUri; |
| 138 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(canonicalUri)); | 137 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(canonicalUri)); |
| 139 String name = node.name; | 138 String name = node.name; |
| 140 if (name == null) { | 139 if (name == null) { |
| 141 // Use the file name as script name. | 140 // Use the file name as script name. |
| 142 String path = canonicalUri.path; | 141 String path = canonicalUri.path; |
| 143 name = path.substring(path.lastIndexOf('/') + 1); | 142 name = path.substring(path.lastIndexOf('/') + 1); |
| 144 } | 143 } |
| 145 return new KLibrary(_libraryMap.length, name, canonicalUri); | 144 return new KLibrary(_libraryMap.length, name, canonicalUri); |
| 146 }); | 145 }); |
| 147 } | 146 } |
| 148 | 147 |
| 149 MemberEntity lookupLibraryMember(KLibrary library, String name, | 148 MemberEntity lookupLibraryMember(KLibrary library, String name, |
| 150 {bool setter: false}) { | 149 {bool setter: false}) { |
| 151 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 150 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 152 ir.Member member = libraryEnv.lookupMember(name, setter: setter); | 151 ir.Member member = libraryEnv.lookupMember(name, setter: setter); |
| 153 return member != null ? getMember(member) : null; | 152 return member != null ? getMember(member) : null; |
| 154 } | 153 } |
| 155 | 154 |
| 156 ClassEntity lookupClass(KLibrary library, String name) { | 155 ClassEntity lookupClass(KLibrary library, String name) { |
| 157 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 156 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 158 KClassEnv classEnv = libraryEnv.lookupClass(name); | 157 _KClassEnv classEnv = libraryEnv.lookupClass(name); |
| 159 if (classEnv != null) { | 158 if (classEnv != null) { |
| 160 return _getClass(classEnv.cls, classEnv); | 159 return _getClass(classEnv.cls, classEnv); |
| 161 } | 160 } |
| 162 return null; | 161 return null; |
| 163 } | 162 } |
| 164 | 163 |
| 165 void _forEachClass(KLibrary library, void f(ClassEntity cls)) { | 164 void _forEachClass(KLibrary library, void f(ClassEntity cls)) { |
| 166 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; | 165 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
| 167 libraryEnv.forEachClass((KClassEnv classEnv) { | 166 libraryEnv.forEachClass((_KClassEnv classEnv) { |
| 168 f(_getClass(classEnv.cls, classEnv)); | 167 f(_getClass(classEnv.cls, classEnv)); |
| 169 }); | 168 }); |
| 170 } | 169 } |
| 171 | 170 |
| 172 MemberEntity lookupClassMember(KClass cls, String name, | 171 MemberEntity lookupClassMember(KClass cls, String name, |
| 173 {bool setter: false}) { | 172 {bool setter: false}) { |
| 174 KClassEnv classEnv = _classEnvs[cls.classIndex]; | 173 _KClassEnv classEnv = _classEnvs[cls.classIndex]; |
| 175 ir.Member member = classEnv.lookupMember(name, setter: setter); | 174 ir.Member member = classEnv.lookupMember(name, setter: setter); |
| 176 return member != null ? getMember(member) : null; | 175 return member != null ? getMember(member) : null; |
| 177 } | 176 } |
| 178 | 177 |
| 179 ConstructorEntity lookupConstructor(KClass cls, String name) { | 178 ConstructorEntity lookupConstructor(KClass cls, String name) { |
| 180 KClassEnv classEnv = _classEnvs[cls.classIndex]; | 179 _KClassEnv classEnv = _classEnvs[cls.classIndex]; |
| 181 ir.Member member = classEnv.lookupConstructor(name); | 180 ir.Member member = classEnv.lookupConstructor(name); |
| 182 return member != null ? getConstructor(member) : null; | 181 return member != null ? getConstructor(member) : null; |
| 183 } | 182 } |
| 184 | 183 |
| 185 KClass _getClass(ir.Class node, [KClassEnv classEnv]) { | 184 KClass _getClass(ir.Class node, [_KClassEnv classEnv]) { |
| 186 return _classMap.putIfAbsent(node, () { | 185 return _classMap.putIfAbsent(node, () { |
| 187 KLibrary library = _getLibrary(node.enclosingLibrary); | 186 KLibrary library = _getLibrary(node.enclosingLibrary); |
| 188 if (classEnv == null) { | 187 if (classEnv == null) { |
| 189 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); | 188 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); |
| 190 } | 189 } |
| 191 _classEnvs.add(classEnv); | 190 _classEnvs.add(classEnv); |
| 192 return new KClass(library, _classMap.length, node.name, | 191 return new KClass(library, _classMap.length, node.name, |
| 193 isAbstract: node.isAbstract); | 192 isAbstract: node.isAbstract); |
| 194 }); | 193 }); |
| 195 } | 194 } |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 List<DartType> getDartTypes(List<ir.DartType> types) { | 378 List<DartType> getDartTypes(List<ir.DartType> types) { |
| 380 // TODO(johnniwinther): Add the type argument to the list literal when we | 379 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 381 // no longer use resolution types. | 380 // no longer use resolution types. |
| 382 List<DartType> list = /*<DartType>*/ []; | 381 List<DartType> list = /*<DartType>*/ []; |
| 383 types.forEach((ir.DartType type) { | 382 types.forEach((ir.DartType type) { |
| 384 list.add(getDartType(type)); | 383 list.add(getDartType(type)); |
| 385 }); | 384 }); |
| 386 return list; | 385 return list; |
| 387 } | 386 } |
| 388 | 387 |
| 389 void _ensureThisAndRawType(KClass cls, KClassEnv env) { | 388 void _ensureThisAndRawType(KClass cls, _KClassEnv env) { |
| 390 if (env.thisType == null) { | 389 if (env.thisType == null) { |
| 391 ir.Class node = env.cls; | 390 ir.Class node = env.cls; |
| 392 // TODO(johnniwinther): Add the type argument to the list literal when we | 391 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 393 // no longer use resolution types. | 392 // no longer use resolution types. |
| 394 if (node.typeParameters.isEmpty) { | 393 if (node.typeParameters.isEmpty) { |
| 395 env.thisType = | 394 env.thisType = |
| 396 env.rawType = new InterfaceType(cls, const/*<DartType>*/ []); | 395 env.rawType = new InterfaceType(cls, const/*<DartType>*/ []); |
| 397 } else { | 396 } else { |
| 398 env.thisType = new InterfaceType( | 397 env.thisType = new InterfaceType( |
| 399 cls, | 398 cls, |
| 400 new List/*<DartType>*/ .generate(node.typeParameters.length, | 399 new List/*<DartType>*/ .generate(node.typeParameters.length, |
| 401 (int index) { | 400 (int index) { |
| 402 return new TypeVariableType( | 401 return new TypeVariableType( |
| 403 _getTypeVariable(node.typeParameters[index])); | 402 _getTypeVariable(node.typeParameters[index])); |
| 404 })); | 403 })); |
| 405 env.rawType = new InterfaceType( | 404 env.rawType = new InterfaceType( |
| 406 cls, | 405 cls, |
| 407 new List/*<DartType>*/ .filled( | 406 new List/*<DartType>*/ .filled( |
| 408 node.typeParameters.length, const DynamicType())); | 407 node.typeParameters.length, const DynamicType())); |
| 409 } | 408 } |
| 410 } | 409 } |
| 411 } | 410 } |
| 412 | 411 |
| 413 InterfaceType _getThisType(KClass cls) { | 412 InterfaceType _getThisType(KClass cls) { |
| 414 KClassEnv env = _classEnvs[cls.classIndex]; | 413 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 415 _ensureThisAndRawType(cls, env); | 414 _ensureThisAndRawType(cls, env); |
| 416 return env.thisType; | 415 return env.thisType; |
| 417 } | 416 } |
| 418 | 417 |
| 419 InterfaceType _getRawType(KClass cls) { | 418 InterfaceType _getRawType(KClass cls) { |
| 420 KClassEnv env = _classEnvs[cls.classIndex]; | 419 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 421 _ensureThisAndRawType(cls, env); | 420 _ensureThisAndRawType(cls, env); |
| 422 return env.rawType; | 421 return env.rawType; |
| 423 } | 422 } |
| 424 | 423 |
| 425 void _ensureSupertypes(KClass cls, KClassEnv env) { | 424 void _ensureSupertypes(KClass cls, _KClassEnv env) { |
| 426 if (env.orderedTypeSet == null) { | 425 if (env.orderedTypeSet == null) { |
| 427 _ensureThisAndRawType(cls, env); | 426 _ensureThisAndRawType(cls, env); |
| 428 | 427 |
| 429 ir.Class node = env.cls; | 428 ir.Class node = env.cls; |
| 430 | 429 |
| 431 if (node.supertype == null) { | 430 if (node.supertype == null) { |
| 432 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); | 431 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); |
| 433 } else { | 432 } else { |
| 434 InterfaceType processSupertype(ir.Supertype node) { | 433 InterfaceType processSupertype(ir.Supertype node) { |
| 435 InterfaceType type = _typeConverter.visitSupertype(node); | 434 InterfaceType type = _typeConverter.visitSupertype(node); |
| 436 KClass superclass = type.element; | 435 KClass superclass = type.element; |
| 437 KClassEnv env = _classEnvs[superclass.classIndex]; | 436 _KClassEnv env = _classEnvs[superclass.classIndex]; |
| 438 _ensureSupertypes(superclass, env); | 437 _ensureSupertypes(superclass, env); |
| 439 return type; | 438 return type; |
| 440 } | 439 } |
| 441 | 440 |
| 442 env.supertype = processSupertype(node.supertype); | 441 env.supertype = processSupertype(node.supertype); |
| 443 LinkBuilder<InterfaceType> linkBuilder = | 442 LinkBuilder<InterfaceType> linkBuilder = |
| 444 new LinkBuilder<InterfaceType>(); | 443 new LinkBuilder<InterfaceType>(); |
| 445 if (node.mixedInType != null) { | 444 if (node.mixedInType != null) { |
| 446 linkBuilder.addLast(processSupertype(node.mixedInType)); | 445 linkBuilder.addLast(processSupertype(node.mixedInType)); |
| 447 } | 446 } |
| 448 node.implementedTypes.forEach((ir.Supertype supertype) { | 447 node.implementedTypes.forEach((ir.Supertype supertype) { |
| 449 linkBuilder.addLast(processSupertype(supertype)); | 448 linkBuilder.addLast(processSupertype(supertype)); |
| 450 }); | 449 }); |
| 451 Link<InterfaceType> interfaces = linkBuilder.toLink(); | 450 Link<InterfaceType> interfaces = linkBuilder.toLink(); |
| 452 OrderedTypeSetBuilder setBuilder = | 451 OrderedTypeSetBuilder setBuilder = |
| 453 new _KernelOrderedTypeSetBuilder(this, cls); | 452 new _KernelOrderedTypeSetBuilder(this, cls); |
| 454 env.orderedTypeSet = | 453 env.orderedTypeSet = |
| 455 setBuilder.createOrderedTypeSet(env.supertype, interfaces); | 454 setBuilder.createOrderedTypeSet(env.supertype, interfaces); |
| 456 } | 455 } |
| 457 } | 456 } |
| 458 } | 457 } |
| 459 | 458 |
| 460 OrderedTypeSet _getOrderedTypeSet(KClass cls) { | 459 OrderedTypeSet _getOrderedTypeSet(KClass cls) { |
| 461 KClassEnv env = _classEnvs[cls.classIndex]; | 460 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 462 _ensureSupertypes(cls, env); | 461 _ensureSupertypes(cls, env); |
| 463 return env.orderedTypeSet; | 462 return env.orderedTypeSet; |
| 464 } | 463 } |
| 465 | 464 |
| 466 int _getHierarchyDepth(KClass cls) { | 465 int _getHierarchyDepth(KClass cls) { |
| 467 KClassEnv env = _classEnvs[cls.classIndex]; | 466 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 468 _ensureSupertypes(cls, env); | 467 _ensureSupertypes(cls, env); |
| 469 return env.orderedTypeSet.maxDepth; | 468 return env.orderedTypeSet.maxDepth; |
| 470 } | 469 } |
| 471 | 470 |
| 472 InterfaceType _substByContext(InterfaceType type, InterfaceType context) { | 471 InterfaceType _substByContext(InterfaceType type, InterfaceType context) { |
| 473 return type.subst( | 472 return type.subst( |
| 474 context.typeArguments, _getThisType(context.element).typeArguments); | 473 context.typeArguments, _getThisType(context.element).typeArguments); |
| 475 } | 474 } |
| 476 | 475 |
| 477 InterfaceType _getSuperType(KClass cls) { | 476 InterfaceType _getSuperType(KClass cls) { |
| 478 KClassEnv env = _classEnvs[cls.classIndex]; | 477 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 479 _ensureSupertypes(cls, env); | 478 _ensureSupertypes(cls, env); |
| 480 return env.supertype; | 479 return env.supertype; |
| 481 } | 480 } |
| 482 | 481 |
| 483 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { | 482 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { |
| 484 KClassEnv env = _classEnvs[cls.classIndex]; | 483 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 485 _ensureSupertypes(cls, env); | 484 _ensureSupertypes(cls, env); |
| 486 env.orderedTypeSet.supertypes.forEach(f); | 485 env.orderedTypeSet.supertypes.forEach(f); |
| 487 } | 486 } |
| 488 | 487 |
| 489 void _forEachClassMember( | 488 void _forEachClassMember( |
| 490 KClass cls, void f(ClassEntity cls, MemberEntity member)) { | 489 KClass cls, void f(ClassEntity cls, MemberEntity member)) { |
| 491 KClassEnv env = _classEnvs[cls.classIndex]; | 490 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 492 env.forEachMember((ir.Member member) { | 491 env.forEachMember((ir.Member member) { |
| 493 f(cls, getMember(member)); | 492 f(cls, getMember(member)); |
| 494 }); | 493 }); |
| 495 _ensureSupertypes(cls, env); | 494 _ensureSupertypes(cls, env); |
| 496 if (env.supertype != null) { | 495 if (env.supertype != null) { |
| 497 _forEachClassMember(env.supertype.element, f); | 496 _forEachClassMember(env.supertype.element, f); |
| 498 } | 497 } |
| 499 } | 498 } |
| 500 | 499 |
| 501 @override | 500 @override |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 589 }); | 588 }); |
| 590 } | 589 } |
| 591 | 590 |
| 592 ResolutionImpact computeWorldImpact(KMember member) { | 591 ResolutionImpact computeWorldImpact(KMember member) { |
| 593 ir.Member node = _memberList[member.memberIndex]; | 592 ir.Member node = _memberList[member.memberIndex]; |
| 594 return buildKernelImpact(node, this); | 593 return buildKernelImpact(node, this); |
| 595 } | 594 } |
| 596 } | 595 } |
| 597 | 596 |
| 598 /// Environment for fast lookup of program libraries. | 597 /// Environment for fast lookup of program libraries. |
| 599 class KEnv { | 598 class _KEnv { |
| 600 final ir.Program program; | 599 final ir.Program program; |
| 601 | 600 |
| 602 Map<Uri, KLibraryEnv> _libraryMap; | 601 Map<Uri, _KLibraryEnv> _libraryMap; |
| 603 | 602 |
| 604 KEnv(this.program); | 603 _KEnv(this.program); |
| 605 | 604 |
| 606 void _ensureLibraryMap() { | 605 void _ensureLibraryMap() { |
| 607 if (_libraryMap == null) { | 606 if (_libraryMap == null) { |
| 608 _libraryMap = <Uri, KLibraryEnv>{}; | 607 _libraryMap = <Uri, _KLibraryEnv>{}; |
| 609 for (ir.Library library in program.libraries) { | 608 for (ir.Library library in program.libraries) { |
| 610 _libraryMap[library.importUri] = new KLibraryEnv(library); | 609 _libraryMap[library.importUri] = new _KLibraryEnv(library); |
| 611 } | 610 } |
| 612 } | 611 } |
| 613 } | 612 } |
| 614 | 613 |
| 615 /// Return the [KLibraryEnv] for the library with the canonical [uri]. | 614 /// Return the [_KLibraryEnv] for the library with the canonical [uri]. |
| 616 KLibraryEnv lookupLibrary(Uri uri) { | 615 _KLibraryEnv lookupLibrary(Uri uri) { |
| 617 _ensureLibraryMap(); | 616 _ensureLibraryMap(); |
| 618 return _libraryMap[uri]; | 617 return _libraryMap[uri]; |
| 619 } | 618 } |
| 620 | 619 |
| 621 /// Calls [f] for each library in this environment. | 620 /// Calls [f] for each library in this environment. |
| 622 void forEachLibrary(void f(KLibraryEnv library)) { | 621 void forEachLibrary(void f(_KLibraryEnv library)) { |
| 623 _ensureLibraryMap(); | 622 _ensureLibraryMap(); |
| 624 _libraryMap.values.forEach(f); | 623 _libraryMap.values.forEach(f); |
| 625 } | 624 } |
| 626 | 625 |
| 627 /// Returns the number of libraries in this environment. | 626 /// Returns the number of libraries in this environment. |
| 628 int get length { | 627 int get length { |
| 629 _ensureLibraryMap(); | 628 _ensureLibraryMap(); |
| 630 return _libraryMap.length; | 629 return _libraryMap.length; |
| 631 } | 630 } |
| 632 } | 631 } |
| 633 | 632 |
| 634 /// Environment for fast lookup of library classes and members. | 633 /// Environment for fast lookup of library classes and members. |
| 635 // TODO(johnniwinther): Add member lookup. | 634 class _KLibraryEnv { |
| 636 class KLibraryEnv { | |
| 637 final ir.Library library; | 635 final ir.Library library; |
| 638 | 636 |
| 639 Map<String, KClassEnv> _classMap; | 637 Map<String, _KClassEnv> _classMap; |
| 640 Map<String, ir.Member> _memberMap; | 638 Map<String, ir.Member> _memberMap; |
| 641 Map<String, ir.Member> _setterMap; | 639 Map<String, ir.Member> _setterMap; |
| 642 | 640 |
| 643 KLibraryEnv(this.library); | 641 _KLibraryEnv(this.library); |
| 644 | 642 |
| 645 void _ensureClassMap() { | 643 void _ensureClassMap() { |
| 646 if (_classMap == null) { | 644 if (_classMap == null) { |
| 647 _classMap = <String, KClassEnv>{}; | 645 _classMap = <String, _KClassEnv>{}; |
| 648 for (ir.Class cls in library.classes) { | 646 for (ir.Class cls in library.classes) { |
| 649 _classMap[cls.name] = new KClassEnv(cls); | 647 _classMap[cls.name] = new _KClassEnv(cls); |
| 650 } | 648 } |
| 651 } | 649 } |
| 652 } | 650 } |
| 653 | 651 |
| 654 /// Return the [KClassEnv] for the class [name] in [library]. | 652 /// Return the [_KClassEnv] for the class [name] in [library]. |
| 655 KClassEnv lookupClass(String name) { | 653 _KClassEnv lookupClass(String name) { |
| 656 _ensureClassMap(); | 654 _ensureClassMap(); |
| 657 return _classMap[name]; | 655 return _classMap[name]; |
| 658 } | 656 } |
| 659 | 657 |
| 660 /// Calls [f] for each class in this library. | 658 /// Calls [f] for each class in this library. |
| 661 void forEachClass(void f(KClassEnv cls)) { | 659 void forEachClass(void f(_KClassEnv cls)) { |
| 662 _ensureClassMap(); | 660 _ensureClassMap(); |
| 663 _classMap.values.forEach(f); | 661 _classMap.values.forEach(f); |
| 664 } | 662 } |
| 665 | 663 |
| 666 /// Return the [ir.Member] for the member [name] in [library]. | 664 /// Return the [ir.Member] for the member [name] in [library]. |
| 667 ir.Member lookupMember(String name, {bool setter: false}) { | 665 ir.Member lookupMember(String name, {bool setter: false}) { |
| 668 if (_memberMap == null) { | 666 if (_memberMap == null) { |
| 669 _memberMap = <String, ir.Member>{}; | 667 _memberMap = <String, ir.Member>{}; |
| 670 _setterMap = <String, ir.Member>{}; | 668 _setterMap = <String, ir.Member>{}; |
| 671 for (ir.Member member in library.members) { | 669 for (ir.Member member in library.members) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 684 throw new SpannableAssertionFailure( | 682 throw new SpannableAssertionFailure( |
| 685 NO_LOCATION_SPANNABLE, "Unexpected library member node: $member"); | 683 NO_LOCATION_SPANNABLE, "Unexpected library member node: $member"); |
| 686 } | 684 } |
| 687 } | 685 } |
| 688 } | 686 } |
| 689 return _memberMap[name]; | 687 return _memberMap[name]; |
| 690 } | 688 } |
| 691 } | 689 } |
| 692 | 690 |
| 693 /// Environment for fast lookup of class members. | 691 /// Environment for fast lookup of class members. |
| 694 // TODO(johnniwinther): Add member lookup. | 692 class _KClassEnv { |
| 695 class KClassEnv { | |
| 696 final ir.Class cls; | 693 final ir.Class cls; |
| 697 | 694 |
| 698 InterfaceType thisType; | 695 InterfaceType thisType; |
| 699 InterfaceType rawType; | 696 InterfaceType rawType; |
| 700 InterfaceType supertype; | 697 InterfaceType supertype; |
| 701 OrderedTypeSet orderedTypeSet; | 698 OrderedTypeSet orderedTypeSet; |
| 702 | 699 |
| 703 Map<String, ir.Member> _constructorMap; | 700 Map<String, ir.Member> _constructorMap; |
| 704 Map<String, ir.Member> _memberMap; | 701 Map<String, ir.Member> _memberMap; |
| 705 Map<String, ir.Member> _setterMap; | 702 Map<String, ir.Member> _setterMap; |
| 706 | 703 |
| 707 Iterable<ConstantExpression> _metadata; | 704 Iterable<ConstantExpression> _metadata; |
| 708 | 705 |
| 709 KClassEnv(this.cls); | 706 _KClassEnv(this.cls); |
| 710 | 707 |
| 711 void _ensureMaps() { | 708 void _ensureMaps() { |
| 712 if (_memberMap == null) { | 709 if (_memberMap == null) { |
| 713 _memberMap = <String, ir.Member>{}; | 710 _memberMap = <String, ir.Member>{}; |
| 714 _setterMap = <String, ir.Member>{}; | 711 _setterMap = <String, ir.Member>{}; |
| 715 _constructorMap = <String, ir.Member>{}; | 712 _constructorMap = <String, ir.Member>{}; |
| 716 for (ir.Member member in cls.members) { | 713 for (ir.Member member in cls.members) { |
| 717 if (member is ir.Constructor || | 714 if (member is ir.Constructor || |
| 718 member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) { | 715 member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) { |
| 719 _constructorMap[member.name.name] = member; | 716 _constructorMap[member.name.name] = member; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 747 ir.Member lookupConstructor(String name) { | 744 ir.Member lookupConstructor(String name) { |
| 748 _ensureMaps(); | 745 _ensureMaps(); |
| 749 return _constructorMap[name]; | 746 return _constructorMap[name]; |
| 750 } | 747 } |
| 751 | 748 |
| 752 void forEachMember(f(ir.Member member)) { | 749 void forEachMember(f(ir.Member member)) { |
| 753 _ensureMaps(); | 750 _ensureMaps(); |
| 754 _memberMap.values.forEach(f); | 751 _memberMap.values.forEach(f); |
| 755 } | 752 } |
| 756 | 753 |
| 757 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) { | 754 Iterable<ConstantExpression> getMetadata(KernelToElementMap worldBuilder) { |
| 758 if (_metadata == null) { | 755 if (_metadata == null) { |
| 759 _metadata = worldBuilder.getMetadata(cls.annotations); | 756 _metadata = worldBuilder.getMetadata(cls.annotations); |
| 760 } | 757 } |
| 761 return _metadata; | 758 return _metadata; |
| 762 } | 759 } |
| 763 } | 760 } |
| 764 | 761 |
| 765 class KernelElementEnvironment implements ElementEnvironment { | 762 class KernelElementEnvironment implements ElementEnvironment { |
| 766 final KernelWorldBuilder worldBuilder; | 763 final KernelToElementMap elementMap; |
| 767 | 764 |
| 768 KernelElementEnvironment(this.worldBuilder); | 765 KernelElementEnvironment(this.elementMap); |
| 769 | 766 |
| 770 @override | 767 @override |
| 771 DartType get dynamicType => const DynamicType(); | 768 DartType get dynamicType => const DynamicType(); |
| 772 | 769 |
| 773 @override | 770 @override |
| 774 LibraryEntity get mainLibrary => worldBuilder._mainLibrary; | 771 LibraryEntity get mainLibrary => elementMap._mainLibrary; |
| 775 | 772 |
| 776 @override | 773 @override |
| 777 FunctionEntity get mainFunction => worldBuilder._mainFunction; | 774 FunctionEntity get mainFunction => elementMap._mainFunction; |
| 778 | 775 |
| 779 @override | 776 @override |
| 780 Iterable<LibraryEntity> get libraries => worldBuilder._libraries; | 777 Iterable<LibraryEntity> get libraries => elementMap._libraries; |
| 781 | 778 |
| 782 @override | 779 @override |
| 783 InterfaceType getThisType(ClassEntity cls) { | 780 InterfaceType getThisType(ClassEntity cls) { |
| 784 return worldBuilder._getThisType(cls); | 781 return elementMap._getThisType(cls); |
| 785 } | 782 } |
| 786 | 783 |
| 787 @override | 784 @override |
| 788 InterfaceType getRawType(ClassEntity cls) { | 785 InterfaceType getRawType(ClassEntity cls) { |
| 789 return worldBuilder._getRawType(cls); | 786 return elementMap._getRawType(cls); |
| 790 } | 787 } |
| 791 | 788 |
| 792 @override | 789 @override |
| 793 DartType getTypeVariableBound(TypeVariableEntity typeVariable) { | 790 DartType getTypeVariableBound(TypeVariableEntity typeVariable) { |
| 794 throw new UnimplementedError( | 791 throw new UnimplementedError( |
| 795 'KernelElementEnvironment.getTypeVariableBound'); | 792 'KernelElementEnvironment.getTypeVariableBound'); |
| 796 } | 793 } |
| 797 | 794 |
| 798 @override | 795 @override |
| 799 InterfaceType createInterfaceType( | 796 InterfaceType createInterfaceType( |
| 800 ClassEntity cls, List<DartType> typeArguments) { | 797 ClassEntity cls, List<DartType> typeArguments) { |
| 801 return new InterfaceType(cls, typeArguments); | 798 return new InterfaceType(cls, typeArguments); |
| 802 } | 799 } |
| 803 | 800 |
| 804 @override | 801 @override |
| 805 bool isSubtype(DartType a, DartType b) { | 802 bool isSubtype(DartType a, DartType b) { |
| 806 return worldBuilder.types.isSubtype(a, b); | 803 return elementMap.types.isSubtype(a, b); |
| 807 } | 804 } |
| 808 | 805 |
| 809 @override | 806 @override |
| 810 FunctionType getFunctionType(KFunction function) { | 807 FunctionType getFunctionType(KFunction function) { |
| 811 throw new UnimplementedError('KernelElementEnvironment.getFunctionType'); | 808 throw new UnimplementedError('KernelElementEnvironment.getFunctionType'); |
| 812 } | 809 } |
| 813 | 810 |
| 814 @override | 811 @override |
| 815 FunctionType getLocalFunctionType(KLocalFunction function) { | 812 FunctionType getLocalFunctionType(KLocalFunction function) { |
| 816 return function.functionType; | 813 return function.functionType; |
| 817 } | 814 } |
| 818 | 815 |
| 819 @override | 816 @override |
| 820 DartType getUnaliasedType(DartType type) => type; | 817 DartType getUnaliasedType(DartType type) => type; |
| 821 | 818 |
| 822 @override | 819 @override |
| 823 ConstructorEntity lookupConstructor(ClassEntity cls, String name, | 820 ConstructorEntity lookupConstructor(ClassEntity cls, String name, |
| 824 {bool required: false}) { | 821 {bool required: false}) { |
| 825 ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name); | 822 ConstructorEntity constructor = elementMap.lookupConstructor(cls, name); |
| 826 if (constructor == null && required) { | 823 if (constructor == null && required) { |
| 827 throw new SpannableAssertionFailure( | 824 throw new SpannableAssertionFailure( |
| 828 CURRENT_ELEMENT_SPANNABLE, | 825 CURRENT_ELEMENT_SPANNABLE, |
| 829 "The constructor '$name' was not found in class '${cls.name}' " | 826 "The constructor '$name' was not found in class '${cls.name}' " |
| 830 "in library ${cls.library.canonicalUri}."); | 827 "in library ${cls.library.canonicalUri}."); |
| 831 } | 828 } |
| 832 return constructor; | 829 return constructor; |
| 833 } | 830 } |
| 834 | 831 |
| 835 @override | 832 @override |
| 836 MemberEntity lookupClassMember(ClassEntity cls, String name, | 833 MemberEntity lookupClassMember(ClassEntity cls, String name, |
| 837 {bool setter: false, bool required: false}) { | 834 {bool setter: false, bool required: false}) { |
| 838 MemberEntity member = | 835 MemberEntity member = |
| 839 worldBuilder.lookupClassMember(cls, name, setter: setter); | 836 elementMap.lookupClassMember(cls, name, setter: setter); |
| 840 if (member == null && required) { | 837 if (member == null && required) { |
| 841 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 838 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, |
| 842 "The member '$name' was not found in ${cls.name}."); | 839 "The member '$name' was not found in ${cls.name}."); |
| 843 } | 840 } |
| 844 return member; | 841 return member; |
| 845 } | 842 } |
| 846 | 843 |
| 847 @override | 844 @override |
| 848 ClassEntity getSuperClass(ClassEntity cls) { | 845 ClassEntity getSuperClass(ClassEntity cls) { |
| 849 return worldBuilder._getSuperType(cls)?.element; | 846 return elementMap._getSuperType(cls)?.element; |
| 850 } | 847 } |
| 851 | 848 |
| 852 @override | 849 @override |
| 853 void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) { | 850 void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) { |
| 854 worldBuilder._forEachSupertype(cls, f); | 851 elementMap._forEachSupertype(cls, f); |
| 855 } | 852 } |
| 856 | 853 |
| 857 @override | 854 @override |
| 858 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) { | 855 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) { |
| 859 throw new UnimplementedError('KernelElementEnvironment.forEachMixin'); | 856 throw new UnimplementedError('KernelElementEnvironment.forEachMixin'); |
| 860 } | 857 } |
| 861 | 858 |
| 862 @override | 859 @override |
| 863 void forEachClassMember( | 860 void forEachClassMember( |
| 864 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { | 861 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { |
| 865 worldBuilder._forEachClassMember(cls, f); | 862 elementMap._forEachClassMember(cls, f); |
| 866 } | 863 } |
| 867 | 864 |
| 868 @override | 865 @override |
| 869 MemberEntity lookupLibraryMember(LibraryEntity library, String name, | 866 MemberEntity lookupLibraryMember(LibraryEntity library, String name, |
| 870 {bool setter: false, bool required: false}) { | 867 {bool setter: false, bool required: false}) { |
| 871 MemberEntity member = | 868 MemberEntity member = |
| 872 worldBuilder.lookupLibraryMember(library, name, setter: setter); | 869 elementMap.lookupLibraryMember(library, name, setter: setter); |
| 873 if (member == null && required) { | 870 if (member == null && required) { |
| 874 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 871 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, |
| 875 "The member '${name}' was not found in library '${library.name}'."); | 872 "The member '${name}' was not found in library '${library.name}'."); |
| 876 } | 873 } |
| 877 return member; | 874 return member; |
| 878 } | 875 } |
| 879 | 876 |
| 880 @override | 877 @override |
| 881 ClassEntity lookupClass(LibraryEntity library, String name, | 878 ClassEntity lookupClass(LibraryEntity library, String name, |
| 882 {bool required: false}) { | 879 {bool required: false}) { |
| 883 ClassEntity cls = worldBuilder.lookupClass(library, name); | 880 ClassEntity cls = elementMap.lookupClass(library, name); |
| 884 if (cls == null && required) { | 881 if (cls == null && required) { |
| 885 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 882 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, |
| 886 "The class '$name' was not found in library '${library.name}'."); | 883 "The class '$name' was not found in library '${library.name}'."); |
| 887 } | 884 } |
| 888 return cls; | 885 return cls; |
| 889 } | 886 } |
| 890 | 887 |
| 891 @override | 888 @override |
| 892 void forEachClass(KLibrary library, void f(ClassEntity cls)) { | 889 void forEachClass(KLibrary library, void f(ClassEntity cls)) { |
| 893 worldBuilder._forEachClass(library, f); | 890 elementMap._forEachClass(library, f); |
| 894 } | 891 } |
| 895 | 892 |
| 896 @override | 893 @override |
| 897 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) { | 894 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) { |
| 898 LibraryEntity library = worldBuilder.lookupLibrary(uri); | 895 LibraryEntity library = elementMap.lookupLibrary(uri); |
| 899 if (library == null && required) { | 896 if (library == null && required) { |
| 900 throw new SpannableAssertionFailure( | 897 throw new SpannableAssertionFailure( |
| 901 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found."); | 898 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found."); |
| 902 } | 899 } |
| 903 return library; | 900 return library; |
| 904 } | 901 } |
| 905 | 902 |
| 906 @override | 903 @override |
| 907 CallStructure getCallStructure(KFunction function) { | 904 CallStructure getCallStructure(KFunction function) { |
| 908 ir.Member member = worldBuilder._memberList[function.memberIndex]; | 905 ir.Member member = elementMap._memberList[function.memberIndex]; |
| 909 ir.FunctionNode functionNode; | 906 ir.FunctionNode functionNode; |
| 910 if (member is ir.Procedure) { | 907 if (member is ir.Procedure) { |
| 911 functionNode = member.function; | 908 functionNode = member.function; |
| 912 } else if (member is ir.Constructor) { | 909 } else if (member is ir.Constructor) { |
| 913 functionNode = member.function; | 910 functionNode = member.function; |
| 914 } else { | 911 } else { |
| 915 throw new SpannableAssertionFailure( | 912 throw new SpannableAssertionFailure( |
| 916 function, "Unexpected function node ${member} for $function."); | 913 function, "Unexpected function node ${member} for $function."); |
| 917 } | 914 } |
| 918 return new CallStructure( | 915 return new CallStructure( |
| 919 functionNode.positionalParameters.length + | 916 functionNode.positionalParameters.length + |
| 920 functionNode.namedParameters.length, | 917 functionNode.namedParameters.length, |
| 921 functionNode.namedParameters.map((d) => d.name).toList()); | 918 functionNode.namedParameters.map((d) => d.name).toList()); |
| 922 } | 919 } |
| 923 | 920 |
| 924 @override | 921 @override |
| 925 bool isDeferredLoadLibraryGetter(KMember member) { | 922 bool isDeferredLoadLibraryGetter(KMember member) { |
| 926 // TODO(johnniwinther): Support these. | 923 // TODO(johnniwinther): Support these. |
| 927 return false; | 924 return false; |
| 928 } | 925 } |
| 929 } | 926 } |
| 930 | 927 |
| 931 /// Visitor that converts kernel dart types into [DartType]. | 928 /// Visitor that converts kernel dart types into [DartType]. |
| 932 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { | 929 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { |
| 933 final KernelWorldBuilder elementAdapter; | 930 final KernelToElementMap elementAdapter; |
| 934 bool topLevel = true; | 931 bool topLevel = true; |
| 935 | 932 |
| 936 DartTypeConverter(this.elementAdapter); | 933 DartTypeConverter(this.elementAdapter); |
| 937 | 934 |
| 938 DartType convert(ir.DartType type) { | 935 DartType convert(ir.DartType type) { |
| 939 topLevel = true; | 936 topLevel = true; |
| 940 return type.accept(this); | 937 return type.accept(this); |
| 941 } | 938 } |
| 942 | 939 |
| 943 /// Visit a inner type. | 940 /// Visit a inner type. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1026 | 1023 |
| 1027 @override | 1024 @override |
| 1028 NativeData get nativeData { | 1025 NativeData get nativeData { |
| 1029 throw new UnimplementedError("KernelNativeBehaviorComputer.nativeData"); | 1026 throw new UnimplementedError("KernelNativeBehaviorComputer.nativeData"); |
| 1030 } | 1027 } |
| 1031 } | 1028 } |
| 1032 | 1029 |
| 1033 /// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using | 1030 /// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using |
| 1034 /// [_EvaluationEnvironment] for the evaluation. | 1031 /// [_EvaluationEnvironment] for the evaluation. |
| 1035 class KernelConstantEnvironment implements ConstantEnvironment { | 1032 class KernelConstantEnvironment implements ConstantEnvironment { |
| 1036 KernelWorldBuilder _worldBuilder; | 1033 KernelToElementMap _worldBuilder; |
| 1037 Map<ConstantExpression, ConstantValue> _valueMap = | 1034 Map<ConstantExpression, ConstantValue> _valueMap = |
| 1038 <ConstantExpression, ConstantValue>{}; | 1035 <ConstantExpression, ConstantValue>{}; |
| 1039 | 1036 |
| 1040 KernelConstantEnvironment(this._worldBuilder); | 1037 KernelConstantEnvironment(this._worldBuilder); |
| 1041 | 1038 |
| 1042 @override | 1039 @override |
| 1043 ConstantSystem get constantSystem => const JavaScriptConstantSystem(); | 1040 ConstantSystem get constantSystem => const JavaScriptConstantSystem(); |
| 1044 | 1041 |
| 1045 @override | 1042 @override |
| 1046 ConstantValue getConstantValueForVariable(VariableElement element) { | 1043 ConstantValue getConstantValueForVariable(VariableElement element) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1058 | 1055 |
| 1059 @override | 1056 @override |
| 1060 bool hasConstantValue(ConstantExpression expression) { | 1057 bool hasConstantValue(ConstantExpression expression) { |
| 1061 throw new UnimplementedError("KernelConstantEnvironment.hasConstantValue"); | 1058 throw new UnimplementedError("KernelConstantEnvironment.hasConstantValue"); |
| 1062 } | 1059 } |
| 1063 } | 1060 } |
| 1064 | 1061 |
| 1065 /// Evaluation environment used for computing [ConstantValue]s for | 1062 /// Evaluation environment used for computing [ConstantValue]s for |
| 1066 /// kernel based [ConstantExpression]s. | 1063 /// kernel based [ConstantExpression]s. |
| 1067 class _EvaluationEnvironment implements Environment { | 1064 class _EvaluationEnvironment implements Environment { |
| 1068 final KernelWorldBuilder _worldBuilder; | 1065 final KernelToElementMap _worldBuilder; |
| 1069 | 1066 |
| 1070 _EvaluationEnvironment(this._worldBuilder); | 1067 _EvaluationEnvironment(this._worldBuilder); |
| 1071 | 1068 |
| 1072 @override | 1069 @override |
| 1073 CommonElements get commonElements { | 1070 CommonElements get commonElements { |
| 1074 throw new UnimplementedError("_EvaluationEnvironment.commonElements"); | 1071 throw new UnimplementedError("_EvaluationEnvironment.commonElements"); |
| 1075 } | 1072 } |
| 1076 | 1073 |
| 1077 @override | 1074 @override |
| 1078 InterfaceType substByContext(InterfaceType base, InterfaceType target) { | 1075 InterfaceType substByContext(InterfaceType base, InterfaceType target) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1097 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant"); | 1094 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant"); |
| 1098 } | 1095 } |
| 1099 | 1096 |
| 1100 @override | 1097 @override |
| 1101 String readFromEnvironment(String name) { | 1098 String readFromEnvironment(String name) { |
| 1102 throw new UnimplementedError("_EvaluationEnvironment.readFromEnvironment"); | 1099 throw new UnimplementedError("_EvaluationEnvironment.readFromEnvironment"); |
| 1103 } | 1100 } |
| 1104 } | 1101 } |
| 1105 | 1102 |
| 1106 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { | 1103 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { |
| 1107 final KernelWorldBuilder worldBuilder; | 1104 final KernelToElementMap elementMap; |
| 1108 | 1105 |
| 1109 KernelResolutionWorldBuilder( | 1106 KernelResolutionWorldBuilder(this.elementMap, NativeBasicData nativeBasicData, |
| 1110 this.worldBuilder, | |
| 1111 NativeBasicData nativeBasicData, | |
| 1112 SelectorConstraintsStrategy selectorConstraintsStrategy) | 1107 SelectorConstraintsStrategy selectorConstraintsStrategy) |
| 1113 : super(worldBuilder.elementEnvironment, worldBuilder.commonElements, | 1108 : super(elementMap.elementEnvironment, elementMap.commonElements, |
| 1114 nativeBasicData, selectorConstraintsStrategy); | 1109 nativeBasicData, selectorConstraintsStrategy); |
| 1115 | 1110 |
| 1116 @override | 1111 @override |
| 1117 Iterable<InterfaceType> getSupertypes(ClassEntity cls) { | 1112 Iterable<InterfaceType> getSupertypes(ClassEntity cls) { |
| 1118 return worldBuilder._getOrderedTypeSet(cls).supertypes; | 1113 return elementMap._getOrderedTypeSet(cls).supertypes; |
| 1119 } | 1114 } |
| 1120 | 1115 |
| 1121 @override | 1116 @override |
| 1122 ClassEntity getSuperClass(ClassEntity cls) { | 1117 ClassEntity getSuperClass(ClassEntity cls) { |
| 1123 return worldBuilder._getSuperType(cls)?.element; | 1118 return elementMap._getSuperType(cls)?.element; |
| 1124 } | 1119 } |
| 1125 | 1120 |
| 1126 @override | 1121 @override |
| 1127 bool implementsFunction(ClassEntity cls) { | 1122 bool implementsFunction(ClassEntity cls) { |
| 1128 // TODO(johnniwinther): Implement this. | 1123 // TODO(johnniwinther): Implement this. |
| 1129 return false; | 1124 return false; |
| 1130 } | 1125 } |
| 1131 | 1126 |
| 1132 @override | 1127 @override |
| 1133 int getHierarchyDepth(ClassEntity cls) { | 1128 int getHierarchyDepth(ClassEntity cls) { |
| 1134 return worldBuilder._getHierarchyDepth(cls); | 1129 return elementMap._getHierarchyDepth(cls); |
| 1135 } | 1130 } |
| 1136 | 1131 |
| 1137 @override | 1132 @override |
| 1138 ClassEntity getAppliedMixin(ClassEntity cls) { | 1133 ClassEntity getAppliedMixin(ClassEntity cls) { |
| 1139 // TODO(johnniwinther): Implement this. | 1134 // TODO(johnniwinther): Implement this. |
| 1140 return null; | 1135 return null; |
| 1141 } | 1136 } |
| 1142 | 1137 |
| 1143 @override | 1138 @override |
| 1144 bool validateClass(ClassEntity cls) => true; | 1139 bool validateClass(ClassEntity cls) => true; |
| 1145 | 1140 |
| 1146 @override | 1141 @override |
| 1147 bool checkClass(ClassEntity cls) => true; | 1142 bool checkClass(ClassEntity cls) => true; |
| 1148 } | 1143 } |
| 1149 | 1144 |
| 1150 // Interface for testing equivalence of Kernel-based entities. | 1145 // Interface for testing equivalence of Kernel-based entities. |
| 1151 class WorldDeconstructionForTesting { | 1146 class WorldDeconstructionForTesting { |
| 1152 final KernelWorldBuilder builder; | 1147 final KernelToElementMap builder; |
| 1153 | 1148 |
| 1154 WorldDeconstructionForTesting(this.builder); | 1149 WorldDeconstructionForTesting(this.builder); |
| 1155 | 1150 |
| 1156 Uri getLibraryUri(KLibrary library) { | 1151 Uri getLibraryUri(KLibrary library) { |
| 1157 return builder._libraryEnvs[library.libraryIndex].library.importUri; | 1152 return builder._libraryEnvs[library.libraryIndex].library.importUri; |
| 1158 } | 1153 } |
| 1159 | 1154 |
| 1160 KLibrary getLibraryForClass(KClass cls) { | 1155 KLibrary getLibraryForClass(KClass cls) { |
| 1161 KClassEnv env = builder._classEnvs[cls.classIndex]; | 1156 _KClassEnv env = builder._classEnvs[cls.classIndex]; |
| 1162 return builder.getLibrary(env.cls.enclosingLibrary); | 1157 return builder.getLibrary(env.cls.enclosingLibrary); |
| 1163 } | 1158 } |
| 1164 | 1159 |
| 1165 KLibrary _getLibrary<E>(E member, Map<ir.Member, E> map) { | 1160 KLibrary _getLibrary<E>(E member, Map<ir.Member, E> map) { |
| 1166 ir.Library library; | 1161 ir.Library library; |
| 1167 map.forEach((ir.Member node, E other) { | 1162 map.forEach((ir.Member node, E other) { |
| 1168 if (library == null && member == other) { | 1163 if (library == null && member == other) { |
| 1169 library = node.enclosingLibrary; | 1164 library = node.enclosingLibrary; |
| 1170 } | 1165 } |
| 1171 }); | 1166 }); |
| 1172 if (library == null) { | 1167 if (library == null) { |
| 1173 throw new ArgumentError("No library found for $member"); | 1168 throw new ArgumentError("No library found for $member"); |
| 1174 } | 1169 } |
| 1175 return builder._getLibrary(library); | 1170 return builder._getLibrary(library); |
| 1176 } | 1171 } |
| 1177 | 1172 |
| 1178 KLibrary getLibraryForFunction(KFunction function) => | 1173 KLibrary getLibraryForFunction(KFunction function) => |
| 1179 _getLibrary(function, builder._methodMap); | 1174 _getLibrary(function, builder._methodMap); |
| 1180 | 1175 |
| 1181 KLibrary getLibraryForField(KField field) => | 1176 KLibrary getLibraryForField(KField field) => |
| 1182 _getLibrary(field, builder._fieldMap); | 1177 _getLibrary(field, builder._fieldMap); |
| 1183 | 1178 |
| 1184 KClass getSuperclassForClass(KClass cls) { | 1179 KClass getSuperclassForClass(KClass cls) { |
| 1185 KClassEnv env = builder._classEnvs[cls.classIndex]; | 1180 _KClassEnv env = builder._classEnvs[cls.classIndex]; |
| 1186 ir.Supertype supertype = env.cls.supertype; | 1181 ir.Supertype supertype = env.cls.supertype; |
| 1187 if (supertype == null) return null; | 1182 if (supertype == null) return null; |
| 1188 return builder.getClass(supertype.classNode); | 1183 return builder.getClass(supertype.classNode); |
| 1189 } | 1184 } |
| 1190 | 1185 |
| 1191 InterfaceType getMixinTypeForClass(KClass cls) { | 1186 InterfaceType getMixinTypeForClass(KClass cls) { |
| 1192 KClassEnv env = builder._classEnvs[cls.classIndex]; | 1187 _KClassEnv env = builder._classEnvs[cls.classIndex]; |
| 1193 ir.Supertype mixedInType = env.cls.mixedInType; | 1188 ir.Supertype mixedInType = env.cls.mixedInType; |
| 1194 if (mixedInType == null) return null; | 1189 if (mixedInType == null) return null; |
| 1195 return builder.createInterfaceType( | 1190 return builder.createInterfaceType( |
| 1196 mixedInType.classNode, mixedInType.typeArguments); | 1191 mixedInType.classNode, mixedInType.typeArguments); |
| 1197 } | 1192 } |
| 1198 } | 1193 } |
| OLD | NEW |