| 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 |