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.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());
}