Fixed unstable inheritance of adapter + declaration.

This commit is contained in:
Evgeny Gerashchenko
2013-07-12 19:31:06 +04:00
parent 13849f6b6e
commit 2a9219b241
@@ -43,6 +43,7 @@ import javax.inject.Inject;
import java.util.*; import java.util.*;
import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*;
import static org.jetbrains.jet.lang.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.CONFLICT;
import static org.jetbrains.jet.lang.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE; import static org.jetbrains.jet.lang.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE;
public class OverrideResolver { public class OverrideResolver {
@@ -242,7 +243,8 @@ public class OverrideResolver {
Queue<CallableMemberDescriptor> fromSuperQueue = new LinkedList<CallableMemberDescriptor>(notOverridden); Queue<CallableMemberDescriptor> fromSuperQueue = new LinkedList<CallableMemberDescriptor>(notOverridden);
while (!fromSuperQueue.isEmpty()) { while (!fromSuperQueue.isEmpty()) {
CallableMemberDescriptor notOverriddenFromSuper = VisibilityUtil.findMemberWithMaxVisibility(fromSuperQueue); CallableMemberDescriptor notOverriddenFromSuper = VisibilityUtil.findMemberWithMaxVisibility(fromSuperQueue);
Collection<CallableMemberDescriptor> overridables = extractMembersOverridableBy(notOverriddenFromSuper, fromSuperQueue, sink); Collection<CallableMemberDescriptor> overridables = extractMembersOverridableInBothWays(notOverriddenFromSuper, fromSuperQueue,
sink);
createAndBindFakeOverride(overridables, current, sink); createAndBindFakeOverride(overridables, current, sink);
} }
} }
@@ -326,7 +328,7 @@ public class OverrideResolver {
} }
@NotNull @NotNull
private static Collection<CallableMemberDescriptor> extractMembersOverridableBy( private static Collection<CallableMemberDescriptor> extractMembersOverridableInBothWays(
@NotNull CallableMemberDescriptor overrider, @NotNull CallableMemberDescriptor overrider,
@NotNull Queue<CallableMemberDescriptor> extractFrom, @NotNull Queue<CallableMemberDescriptor> extractFrom,
@NotNull DescriptorSink sink @NotNull DescriptorSink sink
@@ -340,19 +342,17 @@ public class OverrideResolver {
continue; continue;
} }
OverridingUtil.OverrideCompatibilityInfo.Result result = OverridingUtil.OverrideCompatibilityInfo.Result result1 =
OverridingUtil.isOverridableBy(candidate, overrider).getResult(); OverridingUtil.isOverridableBy(candidate, overrider).getResult();
switch (result) { OverridingUtil.OverrideCompatibilityInfo.Result result2 =
case OVERRIDABLE: OverridingUtil.isOverridableBy(overrider, candidate).getResult();
overridable.add(candidate); if (result1 == OVERRIDABLE && result2 == OVERRIDABLE) {
iterator.remove(); overridable.add(candidate);
break; iterator.remove();
case CONFLICT: }
sink.conflict(overrider, candidate); else if (result1 == CONFLICT || result2 == CONFLICT) {
iterator.remove(); sink.conflict(overrider, candidate);
break; iterator.remove();
case INCOMPATIBLE:
break;
} }
} }
return overridable; return overridable;