From c9e9175a88c5061b4db98c3cf377e22e8833678f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 18 Sep 2012 22:01:39 +0400 Subject: [PATCH] EA-37399 - ISE: OverrideResolver.findInvisibleOverriddenDescriptor Each of the duplicated methods in the subclass should get the same set of overridden descriptors --- .../jet/lang/resolve/OverrideResolver.java | 22 +++++++++++-------- .../tests/override/DuplicateMethod.kt | 8 +++++++ .../checkers/JetDiagnosticsTestGenerated.java | 10 ++++++++- 3 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/override/DuplicateMethod.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index dc3e4467d4c..866eeff1f06 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -184,22 +184,25 @@ public class OverrideResolver { @NotNull ClassDescriptor current, @NotNull DescriptorSink sink ) { - List notOverridden = Lists.newArrayList(membersFromSupertypes); + Collection notOverridden = Sets.newLinkedHashSet(membersFromSupertypes); for (CallableMemberDescriptor fromCurrent : membersFromCurrent) { - extractAndBindOverridesForMember(fromCurrent, notOverridden, current, sink); + Collection bound = + extractAndBindOverridesForMember(fromCurrent, membersFromSupertypes, current, sink); + notOverridden.removeAll(bound); } createAndBindFakeOverrides(current, notOverridden, sink); } - private static void extractAndBindOverridesForMember( + private static Collection extractAndBindOverridesForMember( @NotNull CallableMemberDescriptor fromCurrent, - @NotNull List notOverridden, @NotNull ClassDescriptor current, + @NotNull Collection descriptorsFromSuper, + @NotNull ClassDescriptor current, @NotNull DescriptorSink sink ) { - for (Iterator iterator = notOverridden.iterator(); iterator.hasNext(); ) { - CallableMemberDescriptor fromSupertype = iterator.next(); + Collection 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 notOverridden, + @NotNull Collection notOverridden, @NotNull DescriptorSink sink ) { Queue fromSuperQueue = new LinkedList(notOverridden); diff --git a/compiler/testData/diagnostics/tests/override/DuplicateMethod.kt b/compiler/testData/diagnostics/tests/override/DuplicateMethod.kt new file mode 100644 index 00000000000..aefa4f1673f --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/DuplicateMethod.kt @@ -0,0 +1,8 @@ +trait Some { + fun test() +} + +class SomeImpl : Some { + override fun test() {} + override fun test() {} +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 1d81706f7a6..eddccd51d75 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -15,13 +15,16 @@ */ package org.jetbrains.jet.checkers; +import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; + +import java.io.File; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import java.io.File; +import org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve; /** This class is generated by {@link org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve}. DO NOT MODIFY MANUALLY */ @InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class}) @@ -2342,6 +2345,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/override/DelegationVar.kt"); } + @TestMetadata("DuplicateMethod.kt") + public void testDuplicateMethod() throws Exception { + doTest("compiler/testData/diagnostics/tests/override/DuplicateMethod.kt"); + } + @TestMetadata("EqualityOfIntersectionTypes.kt") public void testEqualityOfIntersectionTypes() throws Exception { doTest("compiler/testData/diagnostics/tests/override/EqualityOfIntersectionTypes.kt");