| 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.world_builder; |
| 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/backend_api.dart'; | 10 import '../common/backend_api.dart'; |
| 11 import '../common/resolution.dart'; |
| 11 import '../compile_time_constants.dart'; | 12 import '../compile_time_constants.dart'; |
| 12 import '../constants/constant_system.dart'; | 13 import '../constants/constant_system.dart'; |
| 13 import '../constants/constructors.dart'; | 14 import '../constants/constructors.dart'; |
| 14 import '../constants/evaluation.dart'; | 15 import '../constants/evaluation.dart'; |
| 15 import '../constants/expressions.dart'; | 16 import '../constants/expressions.dart'; |
| 16 import '../constants/values.dart'; | 17 import '../constants/values.dart'; |
| 17 import '../common_elements.dart'; | 18 import '../common_elements.dart'; |
| 18 import '../elements/elements.dart'; | 19 import '../elements/elements.dart'; |
| 19 import '../elements/entities.dart'; | 20 import '../elements/entities.dart'; |
| 20 import '../elements/types.dart'; | 21 import '../elements/types.dart'; |
| 21 import '../js_backend/backend_helpers.dart'; | 22 import '../js_backend/backend_helpers.dart'; |
| 22 import '../js_backend/constant_system_javascript.dart'; | 23 import '../js_backend/constant_system_javascript.dart'; |
| 23 import '../js_backend/no_such_method_registry.dart'; | 24 import '../js_backend/no_such_method_registry.dart'; |
| 24 import '../native/native.dart' as native; | 25 import '../native/native.dart' as native; |
| 25 import '../native/resolver.dart'; | 26 import '../native/resolver.dart'; |
| 27 import '../ssa/kernel_impact.dart'; |
| 26 import '../universe/call_structure.dart'; | 28 import '../universe/call_structure.dart'; |
| 27 import 'element_adapter.dart'; | 29 import 'element_adapter.dart'; |
| 28 import 'elements.dart'; | 30 import 'elements.dart'; |
| 29 | 31 |
| 30 part 'native_class_resolver.dart'; | 32 part 'native_class_resolver.dart'; |
| 31 part 'no_such_method_resolver.dart'; | 33 part 'no_such_method_resolver.dart'; |
| 32 | 34 |
| 33 /// World builder used for creating elements and types corresponding to Kernel | 35 /// World builder used for creating elements and types corresponding to Kernel |
| 34 /// IR nodes. | 36 /// IR nodes. |
| 35 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. | 37 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 if (parent is ir.FunctionDeclaration || | 311 if (parent is ir.FunctionDeclaration || |
| 310 parent is ir.FunctionExpression) { | 312 parent is ir.FunctionExpression) { |
| 311 KLocalFunction localFunction = _getLocal(parent); | 313 KLocalFunction localFunction = _getLocal(parent); |
| 312 executableContext = localFunction; | 314 executableContext = localFunction; |
| 313 memberContext = localFunction.memberContext; | 315 memberContext = localFunction.memberContext; |
| 314 break; | 316 break; |
| 315 } | 317 } |
| 316 parent = parent.parent; | 318 parent = parent.parent; |
| 317 } | 319 } |
| 318 String name; | 320 String name; |
| 321 FunctionType functionType; |
| 319 if (node is ir.FunctionDeclaration) { | 322 if (node is ir.FunctionDeclaration) { |
| 320 name = node.variable.name; | 323 name = node.variable.name; |
| 324 functionType = getFunctionType(node.function); |
| 325 } else if (node is ir.FunctionExpression) { |
| 326 functionType = getFunctionType(node.function); |
| 321 } | 327 } |
| 322 return new KLocalFunction(name, memberContext, executableContext); | 328 return new KLocalFunction( |
| 329 name, memberContext, executableContext, functionType); |
| 323 }); | 330 }); |
| 324 } | 331 } |
| 325 | 332 |
| 326 @override | 333 @override |
| 327 DartType getDartType(ir.DartType type) => _typeConverter.convert(type); | 334 DartType getDartType(ir.DartType type) => _typeConverter.convert(type); |
| 328 | 335 |
| 329 @override | 336 @override |
| 330 InterfaceType createInterfaceType( | 337 InterfaceType createInterfaceType( |
| 331 ir.Class cls, List<ir.DartType> typeArguments) { | 338 ir.Class cls, List<ir.DartType> typeArguments) { |
| 332 return new InterfaceType(getClass(cls), getDartTypes(typeArguments)); | 339 return new InterfaceType(getClass(cls), getDartTypes(typeArguments)); |
| 333 } | 340 } |
| 334 | 341 |
| 335 @override | 342 @override |
| 336 InterfaceType getInterfaceType(ir.InterfaceType type) => | 343 InterfaceType getInterfaceType(ir.InterfaceType type) => |
| 337 _typeConverter.convert(type); | 344 _typeConverter.convert(type); |
| 338 | 345 |
| 339 @override | 346 @override |
| 340 List<DartType> getDartTypes(List<ir.DartType> types) { | 347 List<DartType> getDartTypes(List<ir.DartType> types) { |
| 341 // TODO(johnniwinther): Add the type argument to the list literal when we | 348 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 342 // no longer use resolution types. | 349 // no longer use resolution types. |
| 343 List<DartType> list = /*<DartType>*/ []; | 350 List<DartType> list = /*<DartType>*/ []; |
| 344 types.forEach((ir.DartType type) { | 351 types.forEach((ir.DartType type) { |
| 345 list.add(getDartType(type)); | 352 list.add(getDartType(type)); |
| 346 }); | 353 }); |
| 347 return list; | 354 return list; |
| 348 } | 355 } |
| 349 | 356 |
| 357 void _ensureThisAndRawType(KClass cls, KClassEnv env) { |
| 358 if (env.thisType == null) { |
| 359 ir.Class node = env.cls; |
| 360 // TODO(johnniwinther): Add the type argument to the list literal when we |
| 361 // no longer use resolution types. |
| 362 if (node.typeParameters.isEmpty) { |
| 363 env.thisType = |
| 364 env.rawType = new InterfaceType(cls, const/*<DartType>*/ []); |
| 365 } else { |
| 366 env.thisType = new InterfaceType( |
| 367 cls, |
| 368 new List/*<DartType>*/ .generate(node.typeParameters.length, |
| 369 (int index) { |
| 370 return new TypeVariableType( |
| 371 _getTypeVariable(node.typeParameters[index])); |
| 372 })); |
| 373 env.rawType = new InterfaceType( |
| 374 cls, |
| 375 new List/*<DartType>*/ .filled( |
| 376 node.typeParameters.length, const DynamicType())); |
| 377 } |
| 378 } |
| 379 } |
| 380 |
| 350 InterfaceType _getThisType(KClass cls) { | 381 InterfaceType _getThisType(KClass cls) { |
| 351 KClassEnv env = _classEnvs[cls.classIndex]; | 382 KClassEnv env = _classEnvs[cls.classIndex]; |
| 352 ir.Class node = env.cls; | 383 _ensureThisAndRawType(cls, env); |
| 353 // TODO(johnniwinther): Add the type argument to the list literal when we | 384 return env.thisType; |
| 354 // no longer use resolution types. | |
| 355 return new InterfaceType( | |
| 356 cls, | |
| 357 new List/*<DartType>*/ .generate(node.typeParameters.length, | |
| 358 (int index) { | |
| 359 return new TypeVariableType( | |
| 360 _getTypeVariable(node.typeParameters[index])); | |
| 361 })); | |
| 362 } | 385 } |
| 363 | 386 |
| 364 InterfaceType _getRawType(KClass cls) { | 387 InterfaceType _getRawType(KClass cls) { |
| 365 KClassEnv env = _classEnvs[cls.classIndex]; | 388 KClassEnv env = _classEnvs[cls.classIndex]; |
| 366 ir.Class node = env.cls; | 389 _ensureThisAndRawType(cls, env); |
| 367 // TODO(johnniwinther): Add the type argument to the list literal when we | 390 return env.rawType; |
| 368 // no longer use resolution types. | 391 } |
| 369 return new InterfaceType( | 392 |
| 370 cls, | 393 void _ensureSupertypes(KClass cls, KClassEnv env) { |
| 371 new List/*<DartType>*/ .filled( | 394 if (env.supertypes == null) { |
| 372 node.typeParameters.length, const DynamicType())); | 395 _ensureThisAndRawType(cls, env); |
| 396 |
| 397 ir.Class node = env.cls; |
| 398 |
| 399 Set<InterfaceType> supertypes = new Set<InterfaceType>(); |
| 400 |
| 401 InterfaceType addSupertype(ir.Supertype node) { |
| 402 if (node == null) return null; |
| 403 InterfaceType type = _typeConverter.visitSupertype(node); |
| 404 KClass superclass = type.element; |
| 405 KClassEnv env = _classEnvs[superclass.classIndex]; |
| 406 _ensureSupertypes(superclass, env); |
| 407 for (InterfaceType supertype in env.supertypes) { |
| 408 supertypes.add( |
| 409 supertype.subst(type.typeArguments, env.thisType.typeArguments)); |
| 410 } |
| 411 return type; |
| 412 } |
| 413 |
| 414 env.supertype = addSupertype(node.supertype); |
| 415 addSupertype(node.mixedInType); |
| 416 node.implementedTypes.forEach(addSupertype); |
| 417 |
| 418 env.supertypes = supertypes.toList(); |
| 419 } |
| 420 } |
| 421 |
| 422 InterfaceType _getSuperType(KClass cls) { |
| 423 KClassEnv env = _classEnvs[cls.classIndex]; |
| 424 _ensureSupertypes(cls, env); |
| 425 return env.supertype; |
| 426 } |
| 427 |
| 428 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { |
| 429 KClassEnv env = _classEnvs[cls.classIndex]; |
| 430 _ensureSupertypes(cls, env); |
| 431 env.supertypes.forEach(f); |
| 373 } | 432 } |
| 374 | 433 |
| 375 @override | 434 @override |
| 376 FunctionType getFunctionType(ir.FunctionNode node) { | 435 FunctionType getFunctionType(ir.FunctionNode node) { |
| 377 DartType returnType = getDartType(node.returnType); | 436 DartType returnType = getDartType(node.returnType); |
| 378 List<DartType> parameterTypes = /*<DartType>*/ []; | 437 List<DartType> parameterTypes = /*<DartType>*/ []; |
| 379 List<DartType> optionalParameterTypes = /*<DartType>*/ []; | 438 List<DartType> optionalParameterTypes = /*<DartType>*/ []; |
| 380 for (ir.VariableDeclaration variable in node.positionalParameters) { | 439 for (ir.VariableDeclaration variable in node.positionalParameters) { |
| 381 if (parameterTypes.length == node.requiredParameterCount) { | 440 if (parameterTypes.length == node.requiredParameterCount) { |
| 382 optionalParameterTypes.add(getDartType(variable.type)); | 441 optionalParameterTypes.add(getDartType(variable.type)); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 ir.Field node = _memberList[field.memberIndex]; | 509 ir.Field node = _memberList[field.memberIndex]; |
| 451 if (node.isConst) { | 510 if (node.isConst) { |
| 452 return new Constantifier(this).visit(node.initializer); | 511 return new Constantifier(this).visit(node.initializer); |
| 453 } | 512 } |
| 454 throw new SpannableAssertionFailure( | 513 throw new SpannableAssertionFailure( |
| 455 field, | 514 field, |
| 456 "Unexpected field $field in " | 515 "Unexpected field $field in " |
| 457 "KernelWorldBuilder._getConstructorConstant"); | 516 "KernelWorldBuilder._getConstructorConstant"); |
| 458 }); | 517 }); |
| 459 } | 518 } |
| 519 |
| 520 ResolutionImpact computeWorldImpact(KMember member) { |
| 521 ir.Member node = _memberList[member.memberIndex]; |
| 522 return buildKernelImpact(node, this); |
| 523 } |
| 460 } | 524 } |
| 461 | 525 |
| 462 /// Environment for fast lookup of program libraries. | 526 /// Environment for fast lookup of program libraries. |
| 463 class KEnv { | 527 class KEnv { |
| 464 final ir.Program program; | 528 final ir.Program program; |
| 465 | 529 |
| 466 Map<Uri, KLibraryEnv> _libraryMap; | 530 Map<Uri, KLibraryEnv> _libraryMap; |
| 467 | 531 |
| 468 KEnv(this.program); | 532 KEnv(this.program); |
| 469 | 533 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 } | 575 } |
| 512 return _memberMap[name]; | 576 return _memberMap[name]; |
| 513 } | 577 } |
| 514 } | 578 } |
| 515 | 579 |
| 516 /// Environment for fast lookup of class members. | 580 /// Environment for fast lookup of class members. |
| 517 // TODO(johnniwinther): Add member lookup. | 581 // TODO(johnniwinther): Add member lookup. |
| 518 class KClassEnv { | 582 class KClassEnv { |
| 519 final ir.Class cls; | 583 final ir.Class cls; |
| 520 | 584 |
| 585 InterfaceType thisType; |
| 586 InterfaceType rawType; |
| 587 InterfaceType supertype; |
| 588 List<InterfaceType> supertypes; |
| 589 |
| 521 Map<String, ir.Member> _constructorMap; | 590 Map<String, ir.Member> _constructorMap; |
| 522 Map<String, ir.Member> _memberMap; | 591 Map<String, ir.Member> _memberMap; |
| 523 | 592 |
| 524 KClassEnv(this.cls); | 593 KClassEnv(this.cls); |
| 525 | 594 |
| 526 void _ensureMaps() { | 595 void _ensureMaps() { |
| 527 if (_memberMap == null) { | 596 if (_memberMap == null) { |
| 528 _memberMap = <String, ir.Member>{}; | 597 _memberMap = <String, ir.Member>{}; |
| 529 _constructorMap = <String, ir.Member>{}; | 598 _constructorMap = <String, ir.Member>{}; |
| 530 for (ir.Member member in cls.members) { | 599 for (ir.Member member in cls.members) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 @override | 631 @override |
| 563 DartType get dynamicType => const DynamicType(); | 632 DartType get dynamicType => const DynamicType(); |
| 564 | 633 |
| 565 @override | 634 @override |
| 566 LibraryEntity get mainLibrary => worldBuilder._mainLibrary; | 635 LibraryEntity get mainLibrary => worldBuilder._mainLibrary; |
| 567 | 636 |
| 568 @override | 637 @override |
| 569 FunctionEntity get mainFunction => worldBuilder._mainFunction; | 638 FunctionEntity get mainFunction => worldBuilder._mainFunction; |
| 570 | 639 |
| 571 @override | 640 @override |
| 641 Iterable<LibraryEntity> get libraries => worldBuilder._libraryMap.values; |
| 642 |
| 643 @override |
| 572 InterfaceType getThisType(ClassEntity cls) { | 644 InterfaceType getThisType(ClassEntity cls) { |
| 573 return worldBuilder._getThisType(cls); | 645 return worldBuilder._getThisType(cls); |
| 574 } | 646 } |
| 575 | 647 |
| 576 @override | 648 @override |
| 577 InterfaceType getRawType(ClassEntity cls) { | 649 InterfaceType getRawType(ClassEntity cls) { |
| 578 return worldBuilder._getRawType(cls); | 650 return worldBuilder._getRawType(cls); |
| 579 } | 651 } |
| 580 | 652 |
| 581 @override | 653 @override |
| 582 DartType getTypeVariableBound(TypeVariableEntity typeVariable) { | 654 DartType getTypeVariableBound(TypeVariableEntity typeVariable) { |
| 583 throw new UnimplementedError( | 655 throw new UnimplementedError( |
| 584 'KernelElementEnvironment.getTypeVariableBound'); | 656 'KernelElementEnvironment.getTypeVariableBound'); |
| 585 } | 657 } |
| 586 | 658 |
| 587 @override | 659 @override |
| 588 InterfaceType createInterfaceType( | 660 InterfaceType createInterfaceType( |
| 589 ClassEntity cls, List<DartType> typeArguments) { | 661 ClassEntity cls, List<DartType> typeArguments) { |
| 590 return new InterfaceType(cls, typeArguments); | 662 return new InterfaceType(cls, typeArguments); |
| 591 } | 663 } |
| 592 | 664 |
| 593 @override | 665 @override |
| 594 bool isSubtype(DartType a, DartType b) { | 666 bool isSubtype(DartType a, DartType b) { |
| 595 throw new UnimplementedError('KernelElementEnvironment.isSubtype'); | 667 // TODO(johnniwinther): Implement this. |
| 668 return false; |
| 596 } | 669 } |
| 597 | 670 |
| 598 @override | 671 @override |
| 599 FunctionType getFunctionType(KFunction function) { | 672 FunctionType getFunctionType(KFunction function) { |
| 600 throw new UnimplementedError('KernelElementEnvironment.getFunctionType'); | 673 throw new UnimplementedError('KernelElementEnvironment.getFunctionType'); |
| 601 } | 674 } |
| 602 | 675 |
| 603 @override | 676 @override |
| 604 FunctionType getLocalFunctionType(Local function) { | 677 FunctionType getLocalFunctionType(KLocalFunction function) { |
| 605 throw new UnimplementedError( | 678 return function.functionType; |
| 606 'KernelElementEnvironment.getLocalFunctionType'); | |
| 607 } | 679 } |
| 608 | 680 |
| 609 @override | 681 @override |
| 610 DartType getUnaliasedType(DartType type) => type; | 682 DartType getUnaliasedType(DartType type) => type; |
| 611 | 683 |
| 612 @override | 684 @override |
| 613 ConstructorEntity lookupConstructor(ClassEntity cls, String name, | 685 ConstructorEntity lookupConstructor(ClassEntity cls, String name, |
| 614 {bool required: false}) { | 686 {bool required: false}) { |
| 615 ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name); | 687 ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name); |
| 616 if (constructor == null && required) { | 688 if (constructor == null && required) { |
| 617 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 689 throw new SpannableAssertionFailure( |
| 618 "The constructor $name was not found in class '${cls.name}'."); | 690 CURRENT_ELEMENT_SPANNABLE, |
| 691 "The constructor '$name' was not found in class '${cls.name}' " |
| 692 "in library ${cls.library.canonicalUri}."); |
| 619 } | 693 } |
| 620 return constructor; | 694 return constructor; |
| 621 } | 695 } |
| 622 | 696 |
| 623 @override | 697 @override |
| 624 MemberEntity lookupClassMember(ClassEntity cls, String name, | 698 MemberEntity lookupClassMember(ClassEntity cls, String name, |
| 625 {bool setter: false, bool required: false}) { | 699 {bool setter: false, bool required: false}) { |
| 626 MemberEntity member = | 700 MemberEntity member = |
| 627 worldBuilder.lookupClassMember(cls, name, setter: setter); | 701 worldBuilder.lookupClassMember(cls, name, setter: setter); |
| 628 if (member == null && required) { | 702 if (member == null && required) { |
| 629 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 703 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, |
| 630 "The member '$name' was not found in ${cls.name}."); | 704 "The member '$name' was not found in ${cls.name}."); |
| 631 } | 705 } |
| 632 return member; | 706 return member; |
| 633 } | 707 } |
| 634 | 708 |
| 635 @override | 709 @override |
| 636 ClassEntity getSuperClass(ClassEntity cls) { | 710 ClassEntity getSuperClass(ClassEntity cls) { |
| 637 throw new UnimplementedError('KernelElementEnvironment.getSuperClass'); | 711 return worldBuilder._getSuperType(cls)?.element; |
| 638 } | 712 } |
| 639 | 713 |
| 640 @override | 714 @override |
| 641 void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) { | 715 void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) { |
| 642 throw new UnimplementedError('KernelElementEnvironment.forEachSupertype'); | 716 worldBuilder._forEachSupertype(cls, f); |
| 643 } | 717 } |
| 644 | 718 |
| 645 @override | 719 @override |
| 646 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) { | 720 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) { |
| 647 throw new UnimplementedError('KernelElementEnvironment.forEachMixin'); | 721 throw new UnimplementedError('KernelElementEnvironment.forEachMixin'); |
| 648 } | 722 } |
| 649 | 723 |
| 650 @override | 724 @override |
| 651 void forEachClassMember( | 725 void forEachClassMember( |
| 652 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { | 726 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { |
| 653 throw new UnimplementedError( | 727 // TODO(johnniwinther): Implement this. |
| 654 'KernelElementEnvironment.forEachInstanceMember'); | |
| 655 } | 728 } |
| 656 | 729 |
| 657 @override | 730 @override |
| 658 MemberEntity lookupLibraryMember(LibraryEntity library, String name, | 731 MemberEntity lookupLibraryMember(LibraryEntity library, String name, |
| 659 {bool setter: false, bool required: false}) { | 732 {bool setter: false, bool required: false}) { |
| 660 MemberEntity member = | 733 MemberEntity member = |
| 661 worldBuilder.lookupLibraryMember(library, name, setter: setter); | 734 worldBuilder.lookupLibraryMember(library, name, setter: setter); |
| 662 if (member == null && required) { | 735 if (member == null && required) { |
| 663 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 736 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, |
| 664 "The member '${name}' was not found in library '${library.name}'."); | 737 "The member '${name}' was not found in library '${library.name}'."); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 topLevel = true; | 796 topLevel = true; |
| 724 return type.accept(this); | 797 return type.accept(this); |
| 725 } | 798 } |
| 726 | 799 |
| 727 /// Visit a inner type. | 800 /// Visit a inner type. |
| 728 DartType visitType(ir.DartType type) { | 801 DartType visitType(ir.DartType type) { |
| 729 topLevel = false; | 802 topLevel = false; |
| 730 return type.accept(this); | 803 return type.accept(this); |
| 731 } | 804 } |
| 732 | 805 |
| 806 InterfaceType visitSupertype(ir.Supertype node) { |
| 807 ClassEntity cls = elementAdapter.getClass(node.classNode); |
| 808 return new InterfaceType(cls, visitTypes(node.typeArguments)); |
| 809 } |
| 810 |
| 733 List<DartType> visitTypes(List<ir.DartType> types) { | 811 List<DartType> visitTypes(List<ir.DartType> types) { |
| 734 topLevel = false; | 812 topLevel = false; |
| 735 return new List.generate( | 813 return new List.generate( |
| 736 types.length, (int index) => types[index].accept(this)); | 814 types.length, (int index) => types[index].accept(this)); |
| 737 } | 815 } |
| 738 | 816 |
| 739 @override | 817 @override |
| 740 DartType visitTypeParameterType(ir.TypeParameterType node) { | 818 DartType visitTypeParameterType(ir.TypeParameterType node) { |
| 741 return new TypeVariableType(elementAdapter.getTypeVariable(node.parameter)); | 819 return new TypeVariableType(elementAdapter.getTypeVariable(node.parameter)); |
| 742 } | 820 } |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 927 } | 1005 } |
| 928 | 1006 |
| 929 InterfaceType getMixinTypeForClass(KClass cls) { | 1007 InterfaceType getMixinTypeForClass(KClass cls) { |
| 930 KClassEnv env = builder._classEnvs[cls.classIndex]; | 1008 KClassEnv env = builder._classEnvs[cls.classIndex]; |
| 931 ir.Supertype mixedInType = env.cls.mixedInType; | 1009 ir.Supertype mixedInType = env.cls.mixedInType; |
| 932 if (mixedInType == null) return null; | 1010 if (mixedInType == null) return null; |
| 933 return builder.createInterfaceType( | 1011 return builder.createInterfaceType( |
| 934 mixedInType.classNode, mixedInType.typeArguments); | 1012 mixedInType.classNode, mixedInType.typeArguments); |
| 935 } | 1013 } |
| 936 } | 1014 } |
| OLD | NEW |