EA-37399 - ISE: OverrideResolver.findInvisibleOverriddenDescriptor

Each of the duplicated methods in the subclass should get the same set of overridden descriptors
This commit is contained in:
Andrey Breslav
2012-09-18 22:01:39 +04:00
parent f8cdb7e81e
commit c9e9175a88
3 changed files with 30 additions and 10 deletions
@@ -184,22 +184,25 @@ public class OverrideResolver {
@NotNull ClassDescriptor current,
@NotNull DescriptorSink sink
) {
List<CallableMemberDescriptor> notOverridden = Lists.newArrayList(membersFromSupertypes);
Collection<CallableMemberDescriptor> notOverridden = Sets.newLinkedHashSet(membersFromSupertypes);
for (CallableMemberDescriptor fromCurrent : membersFromCurrent) {
extractAndBindOverridesForMember(fromCurrent, notOverridden, current, sink);
Collection<CallableMemberDescriptor> bound =
extractAndBindOverridesForMember(fromCurrent, membersFromSupertypes, current, sink);
notOverridden.removeAll(bound);
}
createAndBindFakeOverrides(current, notOverridden, sink);
}
private static void extractAndBindOverridesForMember(
private static Collection<CallableMemberDescriptor> extractAndBindOverridesForMember(
@NotNull CallableMemberDescriptor fromCurrent,
@NotNull List<CallableMemberDescriptor> notOverridden, @NotNull ClassDescriptor current,
@NotNull Collection<? extends CallableMemberDescriptor> descriptorsFromSuper,
@NotNull ClassDescriptor current,
@NotNull DescriptorSink sink
) {
for (Iterator<CallableMemberDescriptor> iterator = notOverridden.iterator(); iterator.hasNext(); ) {
CallableMemberDescriptor fromSupertype = iterator.next();
Collection<CallableMemberDescriptor> bound = Lists.newArrayList();
for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) {
OverridingUtil.OverrideCompatibilityInfo.Result result =
OverridingUtil.isOverridableBy(fromSupertype, fromCurrent).getResult();
@@ -209,23 +212,24 @@ public class OverrideResolver {
if (isVisible) {
OverridingUtil.bindOverride(fromCurrent, fromSupertype);
}
iterator.remove();
bound.add(fromSupertype);
break;
case CONFLICT:
if (isVisible) {
sink.conflict(fromSupertype, fromCurrent);
}
iterator.remove();
bound.add(fromSupertype);
break;
case INCOMPATIBLE:
break;
}
}
return bound;
}
private static void createAndBindFakeOverrides(
@NotNull ClassDescriptor current,
@NotNull List<CallableMemberDescriptor> notOverridden,
@NotNull Collection<CallableMemberDescriptor> notOverridden,
@NotNull DescriptorSink sink
) {
Queue<CallableMemberDescriptor> fromSuperQueue = new LinkedList<CallableMemberDescriptor>(notOverridden);