diff --git a/idea/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java index f257099be7e..d2a824bf850 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.lang.resolve.calls; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.JetSemanticServices; @@ -111,7 +112,8 @@ import java.util.Set; } private boolean overrides(@NotNull Descriptor f, @NotNull Descriptor g) { - Set overriddenDescriptors = f.getOriginal().getOverriddenDescriptors(); + Set overriddenDescriptors = Sets.newHashSet(); + getAllOverriddenDescriptors(f.getOriginal(), overriddenDescriptors); CallableDescriptor originalG = g.getOriginal(); for (CallableDescriptor overriddenFunction : overriddenDescriptors) { if (originalG.equals(overriddenFunction.getOriginal())) return true; @@ -119,4 +121,12 @@ import java.util.Set; return false; } + private void getAllOverriddenDescriptors(@NotNull CallableDescriptor current, @NotNull Set overriddenDescriptors) { + if (overriddenDescriptors.contains(current)) return; + for (CallableDescriptor descriptor : current.getOriginal().getOverriddenDescriptors()) { + getAllOverriddenDescriptors(descriptor, overriddenDescriptors); + overriddenDescriptors.add(descriptor); + } + } + } diff --git a/idea/testData/checker/regression/OverrideResolution.jet b/idea/testData/checker/regression/OverrideResolution.jet new file mode 100644 index 00000000000..05067248efe --- /dev/null +++ b/idea/testData/checker/regression/OverrideResolution.jet @@ -0,0 +1,16 @@ +fun box() { + val a : C + a.foo() +} + +open class A { + fun foo() +} + +open class B : A { + fun foo() +} + +open class C : B { + fun foo() +}