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:
@@ -184,22 +184,25 @@ public class OverrideResolver {
|
|||||||
@NotNull ClassDescriptor current,
|
@NotNull ClassDescriptor current,
|
||||||
@NotNull DescriptorSink sink
|
@NotNull DescriptorSink sink
|
||||||
) {
|
) {
|
||||||
List<CallableMemberDescriptor> notOverridden = Lists.newArrayList(membersFromSupertypes);
|
Collection<CallableMemberDescriptor> notOverridden = Sets.newLinkedHashSet(membersFromSupertypes);
|
||||||
|
|
||||||
for (CallableMemberDescriptor fromCurrent : membersFromCurrent) {
|
for (CallableMemberDescriptor fromCurrent : membersFromCurrent) {
|
||||||
extractAndBindOverridesForMember(fromCurrent, notOverridden, current, sink);
|
Collection<CallableMemberDescriptor> bound =
|
||||||
|
extractAndBindOverridesForMember(fromCurrent, membersFromSupertypes, current, sink);
|
||||||
|
notOverridden.removeAll(bound);
|
||||||
}
|
}
|
||||||
|
|
||||||
createAndBindFakeOverrides(current, notOverridden, sink);
|
createAndBindFakeOverrides(current, notOverridden, sink);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void extractAndBindOverridesForMember(
|
private static Collection<CallableMemberDescriptor> extractAndBindOverridesForMember(
|
||||||
@NotNull CallableMemberDescriptor fromCurrent,
|
@NotNull CallableMemberDescriptor fromCurrent,
|
||||||
@NotNull List<CallableMemberDescriptor> notOverridden, @NotNull ClassDescriptor current,
|
@NotNull Collection<? extends CallableMemberDescriptor> descriptorsFromSuper,
|
||||||
|
@NotNull ClassDescriptor current,
|
||||||
@NotNull DescriptorSink sink
|
@NotNull DescriptorSink sink
|
||||||
) {
|
) {
|
||||||
for (Iterator<CallableMemberDescriptor> iterator = notOverridden.iterator(); iterator.hasNext(); ) {
|
Collection<CallableMemberDescriptor> bound = Lists.newArrayList();
|
||||||
CallableMemberDescriptor fromSupertype = iterator.next();
|
for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) {
|
||||||
OverridingUtil.OverrideCompatibilityInfo.Result result =
|
OverridingUtil.OverrideCompatibilityInfo.Result result =
|
||||||
OverridingUtil.isOverridableBy(fromSupertype, fromCurrent).getResult();
|
OverridingUtil.isOverridableBy(fromSupertype, fromCurrent).getResult();
|
||||||
|
|
||||||
@@ -209,23 +212,24 @@ public class OverrideResolver {
|
|||||||
if (isVisible) {
|
if (isVisible) {
|
||||||
OverridingUtil.bindOverride(fromCurrent, fromSupertype);
|
OverridingUtil.bindOverride(fromCurrent, fromSupertype);
|
||||||
}
|
}
|
||||||
iterator.remove();
|
bound.add(fromSupertype);
|
||||||
break;
|
break;
|
||||||
case CONFLICT:
|
case CONFLICT:
|
||||||
if (isVisible) {
|
if (isVisible) {
|
||||||
sink.conflict(fromSupertype, fromCurrent);
|
sink.conflict(fromSupertype, fromCurrent);
|
||||||
}
|
}
|
||||||
iterator.remove();
|
bound.add(fromSupertype);
|
||||||
break;
|
break;
|
||||||
case INCOMPATIBLE:
|
case INCOMPATIBLE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return bound;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void createAndBindFakeOverrides(
|
private static void createAndBindFakeOverrides(
|
||||||
@NotNull ClassDescriptor current,
|
@NotNull ClassDescriptor current,
|
||||||
@NotNull List<CallableMemberDescriptor> notOverridden,
|
@NotNull Collection<CallableMemberDescriptor> notOverridden,
|
||||||
@NotNull DescriptorSink sink
|
@NotNull DescriptorSink sink
|
||||||
) {
|
) {
|
||||||
Queue<CallableMemberDescriptor> fromSuperQueue = new LinkedList<CallableMemberDescriptor>(notOverridden);
|
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;
|
package org.jetbrains.jet.checkers;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
import junit.framework.Test;
|
import junit.framework.Test;
|
||||||
import junit.framework.TestSuite;
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import org.jetbrains.jet.JetTestUtils;
|
import org.jetbrains.jet.JetTestUtils;
|
||||||
import org.jetbrains.jet.test.InnerTestClasses;
|
import org.jetbrains.jet.test.InnerTestClasses;
|
||||||
import org.jetbrains.jet.test.TestMetadata;
|
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 */
|
/** This class is generated by {@link org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve}. DO NOT MODIFY MANUALLY */
|
||||||
@InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class})
|
@InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class})
|
||||||
@@ -2342,6 +2345,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
|||||||
doTest("compiler/testData/diagnostics/tests/override/DelegationVar.kt");
|
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")
|
@TestMetadata("EqualityOfIntersectionTypes.kt")
|
||||||
public void testEqualityOfIntersectionTypes() throws Exception {
|
public void testEqualityOfIntersectionTypes() throws Exception {
|
||||||
doTest("compiler/testData/diagnostics/tests/override/EqualityOfIntersectionTypes.kt");
|
doTest("compiler/testData/diagnostics/tests/override/EqualityOfIntersectionTypes.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user