Ignoring SAM adapters when checking for unimplemented methods or methods to override.
This commit is contained in:
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.impl.*;
|
||||
import org.jetbrains.jet.lang.diagnostics.Errors;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
@@ -433,10 +434,10 @@ public class OverrideResolver {
|
||||
|
||||
int implCount = countImplementations(relevantDirectlyOverridden);
|
||||
if (implCount == 0) {
|
||||
collectDescriptorsByModality(allFilteredOverriddenDeclarations, abstractNoImpl, Modality.ABSTRACT);
|
||||
collectNotSynthesizedDescriptorsByModality(allFilteredOverriddenDeclarations, abstractNoImpl, Modality.ABSTRACT);
|
||||
}
|
||||
else if (implCount > 1) {
|
||||
collectDescriptorsByModality(allFilteredOverriddenDeclarations, manyImpl, Modality.OPEN, Modality.FINAL);
|
||||
collectNotSynthesizedDescriptorsByModality(allFilteredOverriddenDeclarations, manyImpl, Modality.OPEN, Modality.FINAL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -450,7 +451,7 @@ public class OverrideResolver {
|
||||
return implCount;
|
||||
}
|
||||
|
||||
private static void collectDescriptorsByModality(
|
||||
private static void collectNotSynthesizedDescriptorsByModality(
|
||||
@NotNull Set<CallableMemberDescriptor> allOverriddenDeclarations,
|
||||
@NotNull Set<CallableMemberDescriptor> result,
|
||||
Modality... modalities
|
||||
@@ -458,7 +459,9 @@ public class OverrideResolver {
|
||||
Set<Modality> modalitySet = Sets.newHashSet(modalities);
|
||||
for (CallableMemberDescriptor overridden : allOverriddenDeclarations) {
|
||||
if (modalitySet.contains(overridden.getModality())) {
|
||||
result.add(overridden);
|
||||
if (!CallResolverUtil.isOrOverridesSynthesized(overridden)) {
|
||||
result.add(overridden);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// FILE: A.java
|
||||
public interface A {
|
||||
void foo(Runnable r);
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
public interface B extends A {
|
||||
public void bar(Runnable r);
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
class C: B {
|
||||
override fun foo(r: Runnable?) {
|
||||
}
|
||||
|
||||
override fun bar(r: Runnable?) {
|
||||
}
|
||||
}
|
||||
@@ -3229,6 +3229,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
||||
doTest("compiler/testData/diagnostics/tests/j+k/ambiguousSamAdapters.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("inheritAbstractSamAdapter.kt")
|
||||
public void testInheritAbstractSamAdapter() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/j+k/inheritAbstractSamAdapter.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("innerNestedClassFromJava.kt")
|
||||
public void testInnerNestedClassFromJava() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/j+k/innerNestedClassFromJava.kt");
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.jetbrains.jet.plugin.codeInsight;
|
||||
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
|
||||
import org.jetbrains.jet.lang.resolve.OverrideResolver;
|
||||
import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
@@ -33,7 +34,9 @@ public class OverrideMethodsHandler extends OverrideImplementMethodsHandler {
|
||||
Set<CallableMemberDescriptor> result = new HashSet<CallableMemberDescriptor>();
|
||||
for (CallableMemberDescriptor superMethod : superMethods) {
|
||||
if (superMethod.getModality().isOverridable()) {
|
||||
result.add(superMethod);
|
||||
if (!CallResolverUtil.isOrOverridesSynthesized(superMethod)) {
|
||||
result.add(superMethod);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
package foo;
|
||||
|
||||
public interface A {
|
||||
void foo(Runnable r);
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package foo;
|
||||
|
||||
public interface B extends A {
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package foo
|
||||
|
||||
class Impl: B {
|
||||
<caret>
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package foo
|
||||
|
||||
class Impl: B {
|
||||
|
||||
public override fun foo(r: Runnable?) {
|
||||
throw UnsupportedOperationException()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package foo;
|
||||
|
||||
public class A {
|
||||
public void foo(Runnable r) {}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package foo;
|
||||
|
||||
public class B extends A {
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package foo
|
||||
|
||||
class Impl: B() {
|
||||
<caret>
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package foo
|
||||
|
||||
class Impl: B() {
|
||||
|
||||
public override fun foo(r: Runnable?) {
|
||||
super<B>.foo(r)
|
||||
}
|
||||
}
|
||||
@@ -154,6 +154,14 @@ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase {
|
||||
doMultiOverrideFileTest();
|
||||
}
|
||||
|
||||
public void testImplementSamAdapters() {
|
||||
doImplementDirectoryTest();
|
||||
}
|
||||
|
||||
public void testOverrideSamAdapters() {
|
||||
doOverrideDirectoryTest("foo");
|
||||
}
|
||||
|
||||
private void doImplementFileTest() {
|
||||
doFileTest(new ImplementMethodsHandler());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user