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);
@@ -0,0 +1,8 @@
trait Some {
fun test()
}
class SomeImpl : Some {
<!CONFLICTING_OVERLOADS!>override fun test()<!> {}
<!CONFLICTING_OVERLOADS!>override fun test()<!> {}
}
@@ -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");