Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: pkg/compiler/lib/src/kernel/world_builder.dart

Issue 2831903002: Correctly handle setters in KernelWorldBuilder (Closed)
Patch Set: Fix. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tests/compiler/dart2js/kernel/closed_world2_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/resolution.dart'; 10 import '../common/resolution.dart';
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 } 630 }
631 } 631 }
632 632
633 /// Environment for fast lookup of library classes and members. 633 /// Environment for fast lookup of library classes and members.
634 // TODO(johnniwinther): Add member lookup. 634 // TODO(johnniwinther): Add member lookup.
635 class KLibraryEnv { 635 class KLibraryEnv {
636 final ir.Library library; 636 final ir.Library library;
637 637
638 Map<String, KClassEnv> _classMap; 638 Map<String, KClassEnv> _classMap;
639 Map<String, ir.Member> _memberMap; 639 Map<String, ir.Member> _memberMap;
640 Map<String, ir.Member> _setterMap;
640 641
641 KLibraryEnv(this.library); 642 KLibraryEnv(this.library);
642 643
643 void _ensureClassMap() { 644 void _ensureClassMap() {
644 if (_classMap == null) { 645 if (_classMap == null) {
645 _classMap = <String, KClassEnv>{}; 646 _classMap = <String, KClassEnv>{};
646 for (ir.Class cls in library.classes) { 647 for (ir.Class cls in library.classes) {
647 _classMap[cls.name] = new KClassEnv(cls); 648 _classMap[cls.name] = new KClassEnv(cls);
648 } 649 }
649 } 650 }
650 } 651 }
651 652
652 /// Return the [KClassEnv] for the class [name] in [library]. 653 /// Return the [KClassEnv] for the class [name] in [library].
653 KClassEnv lookupClass(String name) { 654 KClassEnv lookupClass(String name) {
654 _ensureClassMap(); 655 _ensureClassMap();
655 return _classMap[name]; 656 return _classMap[name];
656 } 657 }
657 658
658 /// Calls [f] for each class in this library. 659 /// Calls [f] for each class in this library.
659 void forEachClass(void f(KClassEnv cls)) { 660 void forEachClass(void f(KClassEnv cls)) {
660 _ensureClassMap(); 661 _ensureClassMap();
661 _classMap.values.forEach(f); 662 _classMap.values.forEach(f);
662 } 663 }
663 664
664 /// Return the [ir.Member] for the member [name] in [library]. 665 /// Return the [ir.Member] for the member [name] in [library].
665 ir.Member lookupMember(String name, {bool setter: false}) { 666 ir.Member lookupMember(String name, {bool setter: false}) {
666 if (_memberMap == null) { 667 if (_memberMap == null) {
667 _memberMap = <String, ir.Member>{}; 668 _memberMap = <String, ir.Member>{};
669 _setterMap = <String, ir.Member>{};
668 for (ir.Member member in library.members) { 670 for (ir.Member member in library.members) {
669 // TODO(johnniwinther): Support setter vs. getter. 671 if (member is ir.Procedure) {
670 _memberMap[member.name.name] = member; 672 if (member.kind == ir.ProcedureKind.Setter) {
673 _setterMap[member.name.name] = member;
674 } else {
675 _memberMap[member.name.name] = member;
676 }
677 } else if (member is ir.Field) {
678 _memberMap[member.name.name] = member;
679 if (member.isMutable) {
680 _setterMap[member.name.name] = member;
681 }
682 } else {
683 throw new SpannableAssertionFailure(
684 NO_LOCATION_SPANNABLE, "Unexpected library member node: $member");
685 }
671 } 686 }
672 } 687 }
673 return _memberMap[name]; 688 return _memberMap[name];
674 } 689 }
675 } 690 }
676 691
677 /// Environment for fast lookup of class members. 692 /// Environment for fast lookup of class members.
678 // TODO(johnniwinther): Add member lookup. 693 // TODO(johnniwinther): Add member lookup.
679 class KClassEnv { 694 class KClassEnv {
680 final ir.Class cls; 695 final ir.Class cls;
681 696
682 InterfaceType thisType; 697 InterfaceType thisType;
683 InterfaceType rawType; 698 InterfaceType rawType;
684 InterfaceType supertype; 699 InterfaceType supertype;
685 OrderedTypeSet orderedTypeSet; 700 OrderedTypeSet orderedTypeSet;
686 701
687 Map<String, ir.Member> _constructorMap; 702 Map<String, ir.Member> _constructorMap;
688 Map<String, ir.Member> _memberMap; 703 Map<String, ir.Member> _memberMap;
704 Map<String, ir.Member> _setterMap;
689 705
690 Iterable<ConstantExpression> _metadata; 706 Iterable<ConstantExpression> _metadata;
691 707
692 KClassEnv(this.cls); 708 KClassEnv(this.cls);
693 709
694 void _ensureMaps() { 710 void _ensureMaps() {
695 if (_memberMap == null) { 711 if (_memberMap == null) {
696 _memberMap = <String, ir.Member>{}; 712 _memberMap = <String, ir.Member>{};
713 _setterMap = <String, ir.Member>{};
697 _constructorMap = <String, ir.Member>{}; 714 _constructorMap = <String, ir.Member>{};
698 for (ir.Member member in cls.members) { 715 for (ir.Member member in cls.members) {
699 if (member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) { 716 if (member is ir.Constructor ||
717 member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) {
700 _constructorMap[member.name.name] = member; 718 _constructorMap[member.name.name] = member;
719 } else if (member is ir.Procedure) {
720 if (member.kind == ir.ProcedureKind.Setter) {
721 _setterMap[member.name.name] = member;
722 } else {
723 _memberMap[member.name.name] = member;
724 }
725 } else if (member is ir.Field) {
726 _memberMap[member.name.name] = member;
727 if (member.isMutable) {
728 _setterMap[member.name.name] = member;
729 }
730 _memberMap[member.name.name] = member;
701 } else { 731 } else {
702 // TODO(johnniwinther): Support setter vs. getter. 732 throw new SpannableAssertionFailure(
703 _memberMap[member.name.name] = member; 733 NO_LOCATION_SPANNABLE, "Unexpected class member node: $member");
704 } 734 }
705 } 735 }
706 for (ir.Member member in cls.constructors) {
707 _constructorMap[member.name.name] = member;
708 }
709 } 736 }
710 } 737 }
711 738
712 /// Return the [ir.Member] for the member [name] in [library]. 739 /// Return the [ir.Member] for the member [name] in [library].
713 ir.Member lookupMember(String name, {bool setter: false}) { 740 ir.Member lookupMember(String name, {bool setter: false}) {
714 _ensureMaps(); 741 _ensureMaps();
715 return _memberMap[name]; 742 return setter ? _setterMap[name] : _memberMap[name];
716 } 743 }
717 744
718 /// Return the [ir.Member] for the member [name] in [library]. 745 /// Return the [ir.Member] for the member [name] in [library].
719 ir.Member lookupConstructor(String name, {bool setter: false}) { 746 ir.Member lookupConstructor(String name) {
720 _ensureMaps(); 747 _ensureMaps();
721 return _constructorMap[name]; 748 return _constructorMap[name];
722 } 749 }
723 750
724 void forEachMember(f(ir.Member member)) { 751 void forEachMember(f(ir.Member member)) {
725 _ensureMaps(); 752 _ensureMaps();
726 _memberMap.values.forEach(f); 753 _memberMap.values.forEach(f);
727 } 754 }
728 755
729 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) { 756 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) {
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 } 1144 }
1118 1145
1119 InterfaceType getMixinTypeForClass(KClass cls) { 1146 InterfaceType getMixinTypeForClass(KClass cls) {
1120 KClassEnv env = builder._classEnvs[cls.classIndex]; 1147 KClassEnv env = builder._classEnvs[cls.classIndex];
1121 ir.Supertype mixedInType = env.cls.mixedInType; 1148 ir.Supertype mixedInType = env.cls.mixedInType;
1122 if (mixedInType == null) return null; 1149 if (mixedInType == null) return null;
1123 return builder.createInterfaceType( 1150 return builder.createInterfaceType(
1124 mixedInType.classNode, mixedInType.typeArguments); 1151 mixedInType.classNode, mixedInType.typeArguments);
1125 } 1152 }
1126 } 1153 }
OLDNEW
« no previous file with comments | « no previous file | tests/compiler/dart2js/kernel/closed_world2_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698