Ignoring SAM adapters when checking for unimplemented methods or methods to override.

This commit is contained in:
Evgeny Gerashchenko
2013-06-21 00:01:16 +04:00
parent fd7b29ad48
commit 1f2676becd
13 changed files with 86 additions and 5 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.*; import org.jetbrains.jet.lang.descriptors.impl.*;
import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.psi.*; 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.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -433,10 +434,10 @@ public class OverrideResolver {
int implCount = countImplementations(relevantDirectlyOverridden); int implCount = countImplementations(relevantDirectlyOverridden);
if (implCount == 0) { if (implCount == 0) {
collectDescriptorsByModality(allFilteredOverriddenDeclarations, abstractNoImpl, Modality.ABSTRACT); collectNotSynthesizedDescriptorsByModality(allFilteredOverriddenDeclarations, abstractNoImpl, Modality.ABSTRACT);
} }
else if (implCount > 1) { 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; return implCount;
} }
private static void collectDescriptorsByModality( private static void collectNotSynthesizedDescriptorsByModality(
@NotNull Set<CallableMemberDescriptor> allOverriddenDeclarations, @NotNull Set<CallableMemberDescriptor> allOverriddenDeclarations,
@NotNull Set<CallableMemberDescriptor> result, @NotNull Set<CallableMemberDescriptor> result,
Modality... modalities Modality... modalities
@@ -458,7 +459,9 @@ public class OverrideResolver {
Set<Modality> modalitySet = Sets.newHashSet(modalities); Set<Modality> modalitySet = Sets.newHashSet(modalities);
for (CallableMemberDescriptor overridden : allOverriddenDeclarations) { for (CallableMemberDescriptor overridden : allOverriddenDeclarations) {
if (modalitySet.contains(overridden.getModality())) { 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"); 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") @TestMetadata("innerNestedClassFromJava.kt")
public void testInnerNestedClassFromJava() throws Exception { public void testInnerNestedClassFromJava() throws Exception {
doTest("compiler/testData/diagnostics/tests/j+k/innerNestedClassFromJava.kt"); 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.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor; import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@@ -33,7 +34,9 @@ public class OverrideMethodsHandler extends OverrideImplementMethodsHandler {
Set<CallableMemberDescriptor> result = new HashSet<CallableMemberDescriptor>(); Set<CallableMemberDescriptor> result = new HashSet<CallableMemberDescriptor>();
for (CallableMemberDescriptor superMethod : superMethods) { for (CallableMemberDescriptor superMethod : superMethods) {
if (superMethod.getModality().isOverridable()) { if (superMethod.getModality().isOverridable()) {
result.add(superMethod); if (!CallResolverUtil.isOrOverridesSynthesized(superMethod)) {
result.add(superMethod);
}
} }
} }
return result; 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(); doMultiOverrideFileTest();
} }
public void testImplementSamAdapters() {
doImplementDirectoryTest();
}
public void testOverrideSamAdapters() {
doOverrideDirectoryTest("foo");
}
private void doImplementFileTest() { private void doImplementFileTest() {
doFileTest(new ImplementMethodsHandler()); doFileTest(new ImplementMethodsHandler());
} }