| 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 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/backend_api.dart'; |
| 8 import '../common/names.dart'; | 9 import '../common/names.dart'; |
| 10 import '../compile_time_constants.dart'; |
| 11 import '../constants/constant_system.dart'; |
| 12 import '../constants/constructors.dart'; |
| 13 import '../constants/evaluation.dart'; |
| 14 import '../constants/expressions.dart'; |
| 15 import '../constants/values.dart'; |
| 9 import '../core_types.dart'; | 16 import '../core_types.dart'; |
| 10 import '../elements/elements.dart'; | 17 import '../elements/elements.dart'; |
| 11 import '../elements/entities.dart'; | 18 import '../elements/entities.dart'; |
| 12 import '../elements/types.dart'; | 19 import '../elements/types.dart'; |
| 20 import '../js_backend/backend_helpers.dart'; |
| 21 import '../js_backend/constant_system_javascript.dart'; |
| 13 import '../native/native.dart' as native; | 22 import '../native/native.dart' as native; |
| 14 import 'element_adapter.dart'; | 23 import 'element_adapter.dart'; |
| 15 import 'elements.dart'; | 24 import 'elements.dart'; |
| 16 | 25 |
| 17 /// World builder used for creating elements and types corresponding to Kernel | 26 /// World builder used for creating elements and types corresponding to Kernel |
| 18 /// IR nodes. | 27 /// IR nodes. |
| 19 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. | 28 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. |
| 20 class KernelWorldBuilder extends KernelElementAdapterMixin { | 29 class KernelWorldBuilder extends KernelElementAdapterMixin { |
| 21 CommonElements _commonElements; | 30 CommonElements _commonElements; |
| 31 native.BehaviorBuilder _nativeBehaviorBuilder; |
| 22 final DiagnosticReporter reporter; | 32 final DiagnosticReporter reporter; |
| 23 | 33 ElementEnvironment _elementEnvironment; |
| 24 DartTypeConverter _typeConverter; | 34 DartTypeConverter _typeConverter; |
| 25 | 35 |
| 26 /// Library environment. Used for fast lookup. | 36 /// Library environment. Used for fast lookup. |
| 27 KEnv _env; | 37 KEnv _env; |
| 28 | 38 |
| 29 /// List of library environments by `KLibrary.libraryIndex`. This is used for | 39 /// List of library environments by `KLibrary.libraryIndex`. This is used for |
| 30 /// fast lookup into library classes and members. | 40 /// fast lookup into library classes and members. |
| 31 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[]; | 41 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[]; |
| 32 | 42 |
| 33 /// List of class environments by `KClass.classIndex`. This is used for | 43 /// List of class environments by `KClass.classIndex`. This is used for |
| 34 /// fast lookup into class members. | 44 /// fast lookup into class members. |
| 35 List<KClassEnv> _classEnvs = <KClassEnv>[]; | 45 List<KClassEnv> _classEnvs = <KClassEnv>[]; |
| 36 | 46 |
| 37 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; | 47 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; |
| 38 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; | 48 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; |
| 39 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = | 49 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = |
| 40 <ir.TypeParameter, KTypeVariable>{}; | 50 <ir.TypeParameter, KTypeVariable>{}; |
| 51 |
| 41 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; | 52 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; |
| 53 // TODO(johnniwinther): Change this to a list of 'KConstructorData' class |
| 54 // holding the [ConstantConstructor] if we need more data for constructors. |
| 55 List<ir.Member> _constructorList = <ir.Member>[]; |
| 56 Map<KConstructor, ConstantConstructor> _constructorConstantMap = |
| 57 <KConstructor, ConstantConstructor>{}; |
| 58 |
| 42 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; | 59 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; |
| 43 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; | 60 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; |
| 44 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = | 61 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = |
| 45 <ir.TreeNode, KLocalFunction>{}; | 62 <ir.TreeNode, KLocalFunction>{}; |
| 46 | 63 |
| 47 KernelWorldBuilder(this.reporter, ir.Program program) | 64 KernelWorldBuilder(this.reporter, ir.Program program) |
| 48 : _env = new KEnv(program) { | 65 : _env = new KEnv(program) { |
| 49 _commonElements = | 66 _elementEnvironment = new KernelElementEnvironment(this); |
| 50 new KernelCommonElements(new KernelElementEnvironment(this)); | 67 _commonElements = new KernelCommonElements(_elementEnvironment); |
| 68 BackendHelpers helpers = |
| 69 new BackendHelpers(_elementEnvironment, null, _commonElements); |
| 70 ConstantEnvironment constants = new KernelConstantEnvironment(this); |
| 71 _nativeBehaviorBuilder = |
| 72 new KernelBehaviorBuilder(_commonElements, helpers, constants); |
| 51 _typeConverter = new DartTypeConverter(this); | 73 _typeConverter = new DartTypeConverter(this); |
| 52 } | 74 } |
| 53 | 75 |
| 54 CommonElements get commonElements => _commonElements; | 76 CommonElements get commonElements => _commonElements; |
| 55 | 77 |
| 78 ElementEnvironment get elementEnvironment => _elementEnvironment; |
| 79 |
| 80 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder; |
| 81 |
| 56 LibraryEntity lookupLibrary(Uri uri) { | 82 LibraryEntity lookupLibrary(Uri uri) { |
| 57 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); | 83 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); |
| 58 return _getLibrary(libraryEnv.library, libraryEnv); | 84 return _getLibrary(libraryEnv.library, libraryEnv); |
| 59 } | 85 } |
| 60 | 86 |
| 61 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { | 87 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { |
| 62 return _libraryMap.putIfAbsent(node, () { | 88 return _libraryMap.putIfAbsent(node, () { |
| 63 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(node.importUri)); | 89 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(node.importUri)); |
| 64 String name = node.name; | 90 String name = node.name; |
| 65 if (name == null) { | 91 if (name == null) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 return new KTypeVariable(_getMethod(procedure), node.name, index); | 158 return new KTypeVariable(_getMethod(procedure), node.name, index); |
| 133 } | 159 } |
| 134 } | 160 } |
| 135 } | 161 } |
| 136 throw new UnsupportedError('Unsupported type parameter type node $node.'); | 162 throw new UnsupportedError('Unsupported type parameter type node $node.'); |
| 137 }); | 163 }); |
| 138 } | 164 } |
| 139 | 165 |
| 140 KConstructor _getConstructor(ir.Member node) { | 166 KConstructor _getConstructor(ir.Member node) { |
| 141 return _constructorMap.putIfAbsent(node, () { | 167 return _constructorMap.putIfAbsent(node, () { |
| 168 int constructorIndex = _constructorList.length; |
| 169 KConstructor constructor; |
| 142 if (node is ir.Constructor) { | 170 if (node is ir.Constructor) { |
| 143 return new KGenerativeConstructor( | 171 constructor = new KGenerativeConstructor(constructorIndex, |
| 144 _getClass(node.enclosingClass), getName(node.name)); | 172 _getClass(node.enclosingClass), getName(node.name)); |
| 145 } else { | 173 } else { |
| 146 return new KFactoryConstructor( | 174 constructor = new KFactoryConstructor(constructorIndex, |
| 147 _getClass(node.enclosingClass), getName(node.name)); | 175 _getClass(node.enclosingClass), getName(node.name)); |
| 148 } | 176 } |
| 177 _constructorList.add(node); |
| 178 return constructor; |
| 149 }); | 179 }); |
| 150 } | 180 } |
| 151 | 181 |
| 152 KFunction _getMethod(ir.Procedure node) { | 182 KFunction _getMethod(ir.Procedure node) { |
| 153 return _methodMap.putIfAbsent(node, () { | 183 return _methodMap.putIfAbsent(node, () { |
| 154 KClass enclosingClass = | 184 KClass enclosingClass = |
| 155 node.enclosingClass != null ? _getClass(node.enclosingClass) : null; | 185 node.enclosingClass != null ? _getClass(node.enclosingClass) : null; |
| 156 Name name = getName(node.name); | 186 Name name = getName(node.name); |
| 157 bool isStatic = node.isStatic; | 187 bool isStatic = node.isStatic; |
| 158 switch (node.kind) { | 188 switch (node.kind) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 List<DartType> getDartTypes(List<ir.DartType> types) { | 255 List<DartType> getDartTypes(List<ir.DartType> types) { |
| 226 // TODO(johnniwinther): Add the type argument to the list literal when we | 256 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 227 // no longer use resolution types. | 257 // no longer use resolution types. |
| 228 List<DartType> list = /*<DartType>*/ []; | 258 List<DartType> list = /*<DartType>*/ []; |
| 229 types.forEach((ir.DartType type) { | 259 types.forEach((ir.DartType type) { |
| 230 list.add(getDartType(type)); | 260 list.add(getDartType(type)); |
| 231 }); | 261 }); |
| 232 return list; | 262 return list; |
| 233 } | 263 } |
| 234 | 264 |
| 235 @override | 265 InterfaceType _getThisType(KClass cls) { |
| 236 InterfaceType getThisType(ClassEntity cls) { | |
| 237 throw new UnimplementedError('KernelWorldBuilder.getThisType'); | |
| 238 } | |
| 239 | |
| 240 @override | |
| 241 InterfaceType getRawType(KClass cls) { | |
| 242 KClassEnv env = _classEnvs[cls.classIndex]; | 266 KClassEnv env = _classEnvs[cls.classIndex]; |
| 243 ir.Class node = env.cls; | 267 ir.Class node = env.cls; |
| 244 // TODO(johnniwinther): Add the type argument to the list literal when we | 268 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 269 // no longer use resolution types. |
| 270 return new InterfaceType( |
| 271 cls, |
| 272 new List/*<DartType>*/ .generate(node.typeParameters.length, |
| 273 (int index) { |
| 274 return new TypeVariableType( |
| 275 _getTypeVariable(node.typeParameters[index])); |
| 276 })); |
| 277 } |
| 278 |
| 279 InterfaceType _getRawType(KClass cls) { |
| 280 KClassEnv env = _classEnvs[cls.classIndex]; |
| 281 ir.Class node = env.cls; |
| 282 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 245 // no longer use resolution types. | 283 // no longer use resolution types. |
| 246 return new InterfaceType( | 284 return new InterfaceType( |
| 247 cls, | 285 cls, |
| 248 new List/*<DartType>*/ .filled( | 286 new List/*<DartType>*/ .filled( |
| 249 node.typeParameters.length, const DynamicType())); | 287 node.typeParameters.length, const DynamicType())); |
| 250 } | 288 } |
| 251 | 289 |
| 252 @override | 290 @override |
| 253 native.NativeBehavior getNativeBehaviorForMethod(ir.Procedure procedure) { | 291 FunctionType getFunctionType(ir.FunctionNode node) { |
| 254 throw new UnimplementedError( | 292 DartType returnType = getDartType(node.returnType); |
| 255 'KernelWorldBuilder.getNativeBehaviorForMethod'); | 293 List<DartType> parameterTypes = /*<DartType>*/ []; |
| 256 } | 294 List<DartType> optionalParameterTypes = /*<DartType>*/ []; |
| 257 | 295 for (ir.VariableDeclaration variable in node.positionalParameters) { |
| 258 @override | 296 if (parameterTypes.length == node.requiredParameterCount) { |
| 259 native.NativeBehavior getNativeBehaviorForFieldStore(ir.Field field) { | 297 optionalParameterTypes.add(getDartType(variable.type)); |
| 260 throw new UnimplementedError( | 298 } else { |
| 261 'KernelWorldBuilder.getNativeBehaviorForFieldStore'); | 299 parameterTypes.add(getDartType(variable.type)); |
| 262 } | 300 } |
| 263 | 301 } |
| 264 @override | 302 List<String> namedParameters = <String>[]; |
| 265 native.NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field) { | 303 List<DartType> namedParameterTypes = /*<DartType>*/ []; |
| 266 throw new UnimplementedError( | 304 List<ir.VariableDeclaration> sortedNamedParameters = |
| 267 'KernelWorldBuilder.getNativeBehaviorForFieldLoad'); | 305 node.namedParameters.toList()..sort((a, b) => a.name.compareTo(b.name)); |
| 306 for (ir.VariableDeclaration variable in sortedNamedParameters) { |
| 307 namedParameters.add(variable.name); |
| 308 namedParameterTypes.add(getDartType(variable.type)); |
| 309 } |
| 310 return new FunctionType(returnType, parameterTypes, optionalParameterTypes, |
| 311 namedParameters, namedParameterTypes); |
| 268 } | 312 } |
| 269 | 313 |
| 270 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); | 314 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); |
| 271 | 315 |
| 272 @override | 316 @override |
| 273 Local getLocalFunction(ir.TreeNode node) => _getLocal(node); | 317 Local getLocalFunction(ir.TreeNode node) => _getLocal(node); |
| 274 | 318 |
| 275 @override | 319 @override |
| 276 ClassEntity getClass(ir.Class node) => _getClass(node); | 320 ClassEntity getClass(ir.Class node) => _getClass(node); |
| 277 | 321 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 295 return _getConstructor(node); | 339 return _getConstructor(node); |
| 296 } else { | 340 } else { |
| 297 return _getMethod(node); | 341 return _getMethod(node); |
| 298 } | 342 } |
| 299 } | 343 } |
| 300 throw new UnsupportedError("Unexpected member: $node"); | 344 throw new UnsupportedError("Unexpected member: $node"); |
| 301 } | 345 } |
| 302 | 346 |
| 303 @override | 347 @override |
| 304 FunctionEntity getConstructor(ir.Member node) => _getConstructor(node); | 348 FunctionEntity getConstructor(ir.Member node) => _getConstructor(node); |
| 349 |
| 350 ConstantConstructor _getConstructorConstant(KConstructor constructor) { |
| 351 return _constructorConstantMap.putIfAbsent(constructor, () { |
| 352 ir.Member node = _constructorList[constructor.constructorIndex]; |
| 353 if (node is ir.Constructor && node.isConst) { |
| 354 return new Constantifier(this).computeConstantConstructor(node); |
| 355 } |
| 356 throw new SpannableAssertionFailure(constructor, |
| 357 "Unexpected constructor $constructor in KernelWorldBuilder._getConstru
ctorConstant"); |
| 358 }); |
| 359 } |
| 305 } | 360 } |
| 306 | 361 |
| 307 /// Environment for fast lookup of program libraries. | 362 /// Environment for fast lookup of program libraries. |
| 308 class KEnv { | 363 class KEnv { |
| 309 final ir.Program program; | 364 final ir.Program program; |
| 310 | 365 |
| 311 Map<Uri, KLibraryEnv> _libraryMap; | 366 Map<Uri, KLibraryEnv> _libraryMap; |
| 312 | 367 |
| 313 KEnv(this.program); | 368 KEnv(this.program); |
| 314 | 369 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 } | 436 } |
| 382 } | 437 } |
| 383 for (ir.Member member in cls.constructors) { | 438 for (ir.Member member in cls.constructors) { |
| 384 _constructorMap[member.name.name] = member; | 439 _constructorMap[member.name.name] = member; |
| 385 } | 440 } |
| 386 } | 441 } |
| 387 } | 442 } |
| 388 | 443 |
| 389 /// Return the [ir.Member] for the member [name] in [library]. | 444 /// Return the [ir.Member] for the member [name] in [library]. |
| 390 ir.Member lookupMember(String name, {bool setter: false}) { | 445 ir.Member lookupMember(String name, {bool setter: false}) { |
| 446 _ensureMaps(); |
| 391 return _memberMap[name]; | 447 return _memberMap[name]; |
| 392 } | 448 } |
| 393 | 449 |
| 394 /// Return the [ir.Member] for the member [name] in [library]. | 450 /// Return the [ir.Member] for the member [name] in [library]. |
| 395 ir.Member lookupConstructor(String name, {bool setter: false}) { | 451 ir.Member lookupConstructor(String name, {bool setter: false}) { |
| 452 _ensureMaps(); |
| 396 return _constructorMap[name]; | 453 return _constructorMap[name]; |
| 397 } | 454 } |
| 398 } | 455 } |
| 399 | 456 |
| 400 class KernelElementEnvironment implements ElementEnvironment { | 457 class KernelElementEnvironment implements ElementEnvironment { |
| 401 final KernelWorldBuilder worldBuilder; | 458 final KernelWorldBuilder worldBuilder; |
| 402 | 459 |
| 403 KernelElementEnvironment(this.worldBuilder); | 460 KernelElementEnvironment(this.worldBuilder); |
| 404 | 461 |
| 405 @override | 462 @override |
| 406 InterfaceType getThisType(ClassEntity cls) { | 463 InterfaceType getThisType(ClassEntity cls) { |
| 407 return worldBuilder.getThisType(cls); | 464 return worldBuilder._getThisType(cls); |
| 408 } | 465 } |
| 409 | 466 |
| 410 @override | 467 @override |
| 411 InterfaceType getRawType(ClassEntity cls) { | 468 InterfaceType getRawType(ClassEntity cls) { |
| 412 return worldBuilder.getRawType(cls); | 469 return worldBuilder._getRawType(cls); |
| 413 } | 470 } |
| 414 | 471 |
| 415 @override | 472 @override |
| 416 InterfaceType createInterfaceType( | 473 InterfaceType createInterfaceType( |
| 417 ClassEntity cls, List<DartType> typeArguments) { | 474 ClassEntity cls, List<DartType> typeArguments) { |
| 418 return new InterfaceType(cls, typeArguments); | 475 return new InterfaceType(cls, typeArguments); |
| 419 } | 476 } |
| 420 | 477 |
| 421 @override | 478 @override |
| 422 ConstructorEntity lookupConstructor(ClassEntity cls, String name, | 479 ConstructorEntity lookupConstructor(ClassEntity cls, String name, |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 DartType visitInvalidType(ir.InvalidType node) { | 635 DartType visitInvalidType(ir.InvalidType node) { |
| 579 if (topLevel) { | 636 if (topLevel) { |
| 580 throw new UnimplementedError( | 637 throw new UnimplementedError( |
| 581 "Outermost invalid types not currently supported"); | 638 "Outermost invalid types not currently supported"); |
| 582 } | 639 } |
| 583 // Nested invalid types are treated as `dynamic`. | 640 // Nested invalid types are treated as `dynamic`. |
| 584 return const DynamicType(); | 641 return const DynamicType(); |
| 585 } | 642 } |
| 586 } | 643 } |
| 587 | 644 |
| 645 /// [native.BehaviorBuilder] for kernel based elements. |
| 646 class KernelBehaviorBuilder extends native.BehaviorBuilder { |
| 647 final CommonElements commonElements; |
| 648 final BackendHelpers helpers; |
| 649 final ConstantEnvironment constants; |
| 650 |
| 651 KernelBehaviorBuilder(this.commonElements, this.helpers, this.constants); |
| 652 |
| 653 @override |
| 654 bool get trustJSInteropTypeAnnotations { |
| 655 throw new UnimplementedError( |
| 656 "KernelNativeBehaviorComputer.trustJSInteropTypeAnnotations"); |
| 657 } |
| 658 |
| 659 @override |
| 660 DiagnosticReporter get reporter { |
| 661 throw new UnimplementedError("KernelNativeBehaviorComputer.reporter"); |
| 662 } |
| 663 |
| 664 @override |
| 665 BackendClasses get backendClasses { |
| 666 throw new UnimplementedError("KernelNativeBehaviorComputer.backendClasses"); |
| 667 } |
| 668 } |
| 669 |
| 670 /// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using |
| 671 /// [_EvaluationEnvironment] for the evaluation. |
| 672 class KernelConstantEnvironment implements ConstantEnvironment { |
| 673 KernelWorldBuilder _worldBuilder; |
| 674 Map<ConstantExpression, ConstantValue> _valueMap = |
| 675 <ConstantExpression, ConstantValue>{}; |
| 676 |
| 677 KernelConstantEnvironment(this._worldBuilder); |
| 678 |
| 679 @override |
| 680 ConstantSystem get constantSystem => const JavaScriptConstantSystem(); |
| 681 |
| 682 @override |
| 683 ConstantValue getConstantValueForVariable(VariableElement element) { |
| 684 throw new UnimplementedError( |
| 685 "KernelConstantEnvironment.getConstantValueForVariable"); |
| 686 } |
| 687 |
| 688 @override |
| 689 ConstantValue getConstantValue(ConstantExpression expression) { |
| 690 return _valueMap.putIfAbsent(expression, () { |
| 691 return expression.evaluate( |
| 692 new _EvaluationEnvironment(_worldBuilder), constantSystem); |
| 693 }); |
| 694 } |
| 695 |
| 696 @override |
| 697 bool hasConstantValue(ConstantExpression expression) { |
| 698 throw new UnimplementedError("KernelConstantEnvironment.hasConstantValue"); |
| 699 } |
| 700 } |
| 701 |
| 702 /// Evaluation environment used for computing [ConstantValue]s for |
| 703 /// kernel based [ConstantExpression]s. |
| 704 class _EvaluationEnvironment implements Environment { |
| 705 final KernelWorldBuilder _worldBuilder; |
| 706 |
| 707 _EvaluationEnvironment(this._worldBuilder); |
| 708 |
| 709 @override |
| 710 CommonElements get commonElements { |
| 711 throw new UnimplementedError("_EvaluationEnvironment.commonElements"); |
| 712 } |
| 713 |
| 714 @override |
| 715 BackendClasses get backendClasses { |
| 716 throw new UnimplementedError("_EvaluationEnvironment.backendClasses"); |
| 717 } |
| 718 |
| 719 @override |
| 720 InterfaceType substByContext(InterfaceType base, InterfaceType target) { |
| 721 if (base.typeArguments.isNotEmpty) { |
| 722 throw new UnimplementedError("_EvaluationEnvironment.substByContext"); |
| 723 } |
| 724 return base; |
| 725 } |
| 726 |
| 727 @override |
| 728 ConstantConstructor getConstructorConstant(ConstructorEntity constructor) { |
| 729 return _worldBuilder._getConstructorConstant(constructor); |
| 730 } |
| 731 |
| 732 @override |
| 733 ConstantExpression getFieldConstant(FieldEntity field) { |
| 734 throw new UnimplementedError("_EvaluationEnvironment.getFieldConstant"); |
| 735 } |
| 736 |
| 737 @override |
| 738 ConstantExpression getLocalConstant(Local local) { |
| 739 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant"); |
| 740 } |
| 741 |
| 742 @override |
| 743 String readFromEnvironment(String name) { |
| 744 throw new UnimplementedError("_EvaluationEnvironment.readFromEnvironment"); |
| 745 } |
| 746 } |
| 747 |
| 588 // Interface for testing equivalence of Kernel-based entities. | 748 // Interface for testing equivalence of Kernel-based entities. |
| 589 class WorldDeconstructionForTesting { | 749 class WorldDeconstructionForTesting { |
| 590 final KernelWorldBuilder builder; | 750 final KernelWorldBuilder builder; |
| 591 | 751 |
| 592 WorldDeconstructionForTesting(this.builder); | 752 WorldDeconstructionForTesting(this.builder); |
| 593 | 753 |
| 594 Uri getLibraryUri(KLibrary library) { | 754 Uri getLibraryUri(KLibrary library) { |
| 595 return builder._libraryEnvs[library.libraryIndex].library.importUri; | 755 return builder._libraryEnvs[library.libraryIndex].library.importUri; |
| 596 } | 756 } |
| 597 | 757 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 612 } | 772 } |
| 613 return builder._getLibrary(library); | 773 return builder._getLibrary(library); |
| 614 } | 774 } |
| 615 | 775 |
| 616 KLibrary getLibraryForFunction(KFunction function) => | 776 KLibrary getLibraryForFunction(KFunction function) => |
| 617 _getLibrary(function, builder._methodMap); | 777 _getLibrary(function, builder._methodMap); |
| 618 | 778 |
| 619 KLibrary getLibraryForField(KField field) => | 779 KLibrary getLibraryForField(KField field) => |
| 620 _getLibrary(field, builder._fieldMap); | 780 _getLibrary(field, builder._fieldMap); |
| 621 } | 781 } |
| OLD | NEW |