diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index c76866d56cf..1a88347c6c5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -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 allOverriddenDeclarations, @NotNull Set result, Modality... modalities @@ -458,7 +459,9 @@ public class OverrideResolver { Set modalitySet = Sets.newHashSet(modalities); for (CallableMemberDescriptor overridden : allOverriddenDeclarations) { if (modalitySet.contains(overridden.getModality())) { - result.add(overridden); + if (!CallResolverUtil.isOrOverridesSynthesized(overridden)) { + result.add(overridden); + } } } } diff --git a/compiler/testData/diagnostics/tests/j+k/inheritAbstractSamAdapter.kt b/compiler/testData/diagnostics/tests/j+k/inheritAbstractSamAdapter.kt new file mode 100644 index 00000000000..7ddceb7a976 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/inheritAbstractSamAdapter.kt @@ -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?) { + } +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 4c08680cbe5..8b0f69adf8d 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -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"); diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideMethodsHandler.java index 77966904202..d8151e55cc3 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideMethodsHandler.java @@ -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 result = new HashSet(); for (CallableMemberDescriptor superMethod : superMethods) { if (superMethod.getModality().isOverridable()) { - result.add(superMethod); + if (!CallResolverUtil.isOrOverridesSynthesized(superMethod)) { + result.add(superMethod); + } } } return result; diff --git a/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/A.java b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/A.java new file mode 100644 index 00000000000..b31123ea403 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/A.java @@ -0,0 +1,5 @@ +package foo; + +public interface A { + void foo(Runnable r); +} diff --git a/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/B.java b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/B.java new file mode 100644 index 00000000000..85a9a7f77b6 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/B.java @@ -0,0 +1,4 @@ +package foo; + +public interface B extends A { +} diff --git a/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt new file mode 100644 index 00000000000..1b37ab9c3be --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt @@ -0,0 +1,5 @@ +package foo + +class Impl: B { + +} diff --git a/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt.after new file mode 100644 index 00000000000..14825990b7e --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt.after @@ -0,0 +1,8 @@ +package foo + +class Impl: B { + + public override fun foo(r: Runnable?) { + throw UnsupportedOperationException() + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/A.java b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/A.java new file mode 100644 index 00000000000..a68997c442c --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/A.java @@ -0,0 +1,5 @@ +package foo; + +public class A { + public void foo(Runnable r) {} +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/B.java b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/B.java new file mode 100644 index 00000000000..53c4dabc22c --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/B.java @@ -0,0 +1,4 @@ +package foo; + +public class B extends A { +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt new file mode 100644 index 00000000000..fd9a314b512 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt @@ -0,0 +1,5 @@ +package foo + +class Impl: B() { + +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after new file mode 100644 index 00000000000..b281b5951e7 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after @@ -0,0 +1,8 @@ +package foo + +class Impl: B() { + + public override fun foo(r: Runnable?) { + super.foo(r) + } +} diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java index 80fe095353b..38b474ba801 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java @@ -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()); }