OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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.resolution.compute_members; | 5 library dart2js.resolution.compute_members; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/names.dart' show Identifiers, Names; | 8 import '../common/names.dart' show Identifiers, Names; |
9 import '../common/resolution.dart' show Resolution; | 9 import '../common/resolution.dart' show Resolution; |
10 import '../elements/resolution_types.dart'; | 10 import '../elements/resolution_types.dart'; |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 /// members with these names. | 590 /// members with these names. |
591 Map<Name, Setlet<Member>> computeSuperMembers( | 591 Map<Name, Setlet<Member>> computeSuperMembers( |
592 String name, Setlet<Name> names) { | 592 String name, Setlet<Name> names) { |
593 computeSuperClassMembers(name, names); | 593 computeSuperClassMembers(name, names); |
594 return computeSuperInterfaceMembers(name, names); | 594 return computeSuperInterfaceMembers(name, names); |
595 } | 595 } |
596 | 596 |
597 Map<Name, Setlet<Member>> computeSuperInterfaceMembers( | 597 Map<Name, Setlet<Member>> computeSuperInterfaceMembers( |
598 String name, Setlet<Name> names) { | 598 String name, Setlet<Name> names) { |
599 ResolutionInterfaceType supertype = cls.supertype; | 599 ResolutionInterfaceType supertype = cls.supertype; |
600 assert(invariant(cls, supertype != null, | 600 assert(supertype != null, |
601 message: "Interface members computed for $cls.")); | 601 failedAt(cls, "Interface members computed for $cls.")); |
602 ClassElement superclass = supertype.element; | 602 ClassElement superclass = supertype.element; |
603 | 603 |
604 Map<Name, Setlet<Member>> inheritedInterfaceMembers = | 604 Map<Name, Setlet<Member>> inheritedInterfaceMembers = |
605 new Map<Name, Setlet<Member>>(); | 605 new Map<Name, Setlet<Member>>(); |
606 | 606 |
607 void inheritInterfaceMember( | 607 void inheritInterfaceMember( |
608 ResolutionInterfaceType supertype, MemberSignature member) { | 608 ResolutionInterfaceType supertype, MemberSignature member) { |
609 if (shouldSkipMember(member)) return; | 609 if (shouldSkipMember(member)) return; |
610 Setlet<Member> members = inheritedInterfaceMembers.putIfAbsent( | 610 Setlet<Member> members = inheritedInterfaceMembers.putIfAbsent( |
611 member.name, () => new Setlet<Member>()); | 611 member.name, () => new Setlet<Member>()); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 DiagnosticMessage warning = reporter.createMessage( | 714 DiagnosticMessage warning = reporter.createMessage( |
715 cls, | 715 cls, |
716 MessageKind.INHERIT_GETTER_AND_METHOD, | 716 MessageKind.INHERIT_GETTER_AND_METHOD, |
717 {'class': thisType, 'name': name.text}); | 717 {'class': thisType, 'name': name.text}); |
718 List<DiagnosticMessage> infos = <DiagnosticMessage>[]; | 718 List<DiagnosticMessage> infos = <DiagnosticMessage>[]; |
719 for (Member inherited in inheritedMembers) { | 719 for (Member inherited in inheritedMembers) { |
720 MessageKind kind; | 720 MessageKind kind; |
721 if (inherited.isMethod) { | 721 if (inherited.isMethod) { |
722 kind = MessageKind.INHERITED_METHOD; | 722 kind = MessageKind.INHERITED_METHOD; |
723 } else { | 723 } else { |
724 assert(invariant(cls, inherited.isGetter, | 724 assert( |
725 message: 'Conflicting member is neither a method nor a ' | 725 inherited.isGetter, |
726 'getter.')); | 726 failedAt(cls, |
| 727 'Conflicting member is neither a method nor a getter.')); |
727 if (inherited.isDeclaredByField) { | 728 if (inherited.isDeclaredByField) { |
728 kind = MessageKind.INHERITED_IMPLICIT_GETTER; | 729 kind = MessageKind.INHERITED_IMPLICIT_GETTER; |
729 } else { | 730 } else { |
730 kind = MessageKind.INHERITED_EXPLICIT_GETTER; | 731 kind = MessageKind.INHERITED_EXPLICIT_GETTER; |
731 } | 732 } |
732 } | 733 } |
733 infos.add(reporter.createMessage(inherited.element, kind, | 734 infos.add(reporter.createMessage(inherited.element, kind, |
734 {'class': inherited.declarer, 'name': name.text})); | 735 {'class': inherited.declarer, 'name': name.text})); |
735 } | 736 } |
736 reporter.reportWarning(warning, infos); | 737 reporter.reportWarning(warning, infos); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 } | 909 } |
909 | 910 |
910 void computeAllClassMembers(Resolution resolution) { | 911 void computeAllClassMembers(Resolution resolution) { |
911 // TODO(johnniwinther): Should we assert that the class has been resolved | 912 // TODO(johnniwinther): Should we assert that the class has been resolved |
912 // instead? | 913 // instead? |
913 ensureResolved(resolution); | 914 ensureResolved(resolution); |
914 if (areAllMembersComputed()) return; | 915 if (areAllMembersComputed()) return; |
915 MembersCreator creator = _prepareCreator(resolution); | 916 MembersCreator creator = _prepareCreator(resolution); |
916 creator.computeAllMembers(); | 917 creator.computeAllMembers(); |
917 computedMemberNames = null; | 918 computedMemberNames = null; |
918 assert(invariant(this, areAllMembersComputed())); | 919 assert(areAllMembersComputed(), failedAt(this)); |
919 } | 920 } |
920 | 921 |
921 bool areAllMembersComputed() { | 922 bool areAllMembersComputed() { |
922 return computedMemberNames == null && classMembers != null; | 923 return computedMemberNames == null && classMembers != null; |
923 } | 924 } |
924 | 925 |
925 bool isMemberComputed(String name) { | 926 bool isMemberComputed(String name) { |
926 if (computedMemberNames == null) { | 927 if (computedMemberNames == null) { |
927 return classMembers != null; | 928 return classMembers != null; |
928 } else { | 929 } else { |
929 return name == Identifiers.call || computedMemberNames.contains(name); | 930 return name == Identifiers.call || computedMemberNames.contains(name); |
930 } | 931 } |
931 } | 932 } |
932 | 933 |
933 Member lookupClassMember(Name name) { | 934 Member lookupClassMember(Name name) { |
934 assert(invariant(this, isMemberComputed(name.text), | 935 assert(isMemberComputed(name.text), |
935 message: "Member ${name} has not been computed for $this.")); | 936 failedAt(this, "Member ${name} has not been computed for $this.")); |
936 return classMembers[name]; | 937 return classMembers[name]; |
937 } | 938 } |
938 | 939 |
939 void forEachClassMember(f(Member member)) { | 940 void forEachClassMember(f(Member member)) { |
940 assert(invariant(this, areAllMembersComputed(), | 941 assert(areAllMembersComputed(), |
941 message: "Members have not been fully computed for $this.")); | 942 failedAt(this, "Members have not been fully computed for $this.")); |
942 classMembers.forEach((_, member) => f(member)); | 943 classMembers.forEach((_, member) => f(member)); |
943 } | 944 } |
944 | 945 |
945 MemberSignature lookupInterfaceMember(Name name) { | 946 MemberSignature lookupInterfaceMember(Name name) { |
946 assert(invariant(this, isMemberComputed(name.text), | 947 assert(isMemberComputed(name.text), |
947 message: "Member ${name.text} has not been computed for $this.")); | 948 failedAt(this, "Member ${name.text} has not been computed for $this.")); |
948 if (interfaceMembersAreClassMembers) { | 949 if (interfaceMembersAreClassMembers) { |
949 Member member = classMembers[name]; | 950 Member member = classMembers[name]; |
950 if (member != null && member.isStatic) return null; | 951 if (member != null && member.isStatic) return null; |
951 return member; | 952 return member; |
952 } | 953 } |
953 return interfaceMembers[name]; | 954 return interfaceMembers[name]; |
954 } | 955 } |
955 | 956 |
956 void forEachInterfaceMember(f(MemberSignature member)) { | 957 void forEachInterfaceMember(f(MemberSignature member)) { |
957 assert(invariant(this, areAllMembersComputed(), | 958 assert(areAllMembersComputed(), |
958 message: "Members have not been fully computed for $this.")); | 959 failedAt(this, "Members have not been fully computed for $this.")); |
959 if (interfaceMembersAreClassMembers) { | 960 if (interfaceMembersAreClassMembers) { |
960 classMembers.forEach((_, member) { | 961 classMembers.forEach((_, member) { |
961 if (!member.isStatic) f(member); | 962 if (!member.isStatic) f(member); |
962 }); | 963 }); |
963 } else { | 964 } else { |
964 interfaceMembers.forEach((_, member) => f(member)); | 965 interfaceMembers.forEach((_, member) => f(member)); |
965 } | 966 } |
966 } | 967 } |
967 } | 968 } |
OLD | NEW |