diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMethodsHandler.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMethodsHandler.kt index 4be7e8ca8b8..b374b60556a 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMethodsHandler.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMethodsHandler.kt @@ -17,10 +17,7 @@ package org.jetbrains.kotlin.idea.core.overrideImplement import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.* import java.util.ArrayList import java.util.LinkedHashMap @@ -31,7 +28,7 @@ public class OverrideMethodsHandler : OverrideImplementMethodsHandler() { if (member is CallableMemberDescriptor && (member.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE || member.kind == CallableMemberDescriptor.Kind.DELEGATION)) { val overridden = member.overriddenDescriptors - if (overridden.any { it.modality == Modality.FINAL }) continue + if (overridden.any { it.modality == Modality.FINAL || it.visibility.normalize() == Visibilities.PRIVATE }) continue val realSuperToImmediates = LinkedHashMap>() for (immediateSuper in overridden) { diff --git a/idea/testData/codeInsight/overrideImplement/privateJavaMethod/foo/A.java b/idea/testData/codeInsight/overrideImplement/privateJavaMethod/foo/A.java new file mode 100644 index 00000000000..e09dfa6631e --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/privateJavaMethod/foo/A.java @@ -0,0 +1,5 @@ +public class A { + public void x(){} + private void y(){} + private void z(){} +} diff --git a/idea/testData/codeInsight/overrideImplement/privateJavaMethod/foo/Impl.kt b/idea/testData/codeInsight/overrideImplement/privateJavaMethod/foo/Impl.kt new file mode 100644 index 00000000000..fccd2cefb27 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/privateJavaMethod/foo/Impl.kt @@ -0,0 +1,7 @@ +interface I { + fun z() +} + +class C : A(), I { + +} diff --git a/idea/testData/codeInsight/overrideImplement/privateJavaMethod/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/privateJavaMethod/foo/Impl.kt.after new file mode 100644 index 00000000000..085b904a80c --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/privateJavaMethod/foo/Impl.kt.after @@ -0,0 +1,25 @@ +interface I { + fun z() +} + +class C : A(), I { + override fun equals(other: Any?): Boolean { + return super.equals(other) + } + + override fun hashCode(): Int { + return super.hashCode() + } + + override fun toString(): String { + return super.toString() + } + + override fun x() { + super.x() + } + + override fun z() { + throw UnsupportedOperationException() + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractOverrideImplementTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractOverrideImplementTest.kt index d3776f1a84d..56e546151d1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractOverrideImplementTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractOverrideImplementTest.kt @@ -70,6 +70,10 @@ public abstract class AbstractOverrideImplementTest : JetLightCodeInsightFixture doDirectoryTest(OverrideMethodsHandler(), memberToImplement) } + protected fun doMultiOverrideDirectoryTest() { + doMultiDirectoryTest(OverrideMethodsHandler()) + } + protected fun doImplementJavaDirectoryTest(className: String, methodName: String) { myFixture.copyDirectoryToProject(getTestName(true), "") myFixture.configureFromTempProjectFile("foo/JavaClass.java") @@ -110,6 +114,13 @@ public abstract class AbstractOverrideImplementTest : JetLightCodeInsightFixture checkResultByFile(getTestName(true) + "/foo/Impl.kt.after") } + private fun doMultiDirectoryTest(handler: OverrideImplementMethodsHandler) { + myFixture.copyDirectoryToProject(getTestName(true), "") + myFixture.configureFromTempProjectFile("foo/Impl.kt") + doMultiOverrideImplement(handler) + checkResultByFile(getTestName(true) + "/foo/Impl.kt.after") + } + private fun doOverrideImplement(handler: OverrideImplementMethodsHandler, memberToOverride: String?) { val elementAtCaret = myFixture.file.findElementAt(myFixture.editor.caretModel.offset) val classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, javaClass()) diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.java index e51a4b512d0..0e91276c7f8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.java @@ -151,6 +151,10 @@ public final class OverrideImplementTest extends AbstractOverrideImplementTest { doOverrideDirectoryTest("getFooBar"); } + public void testPrivateJavaMethod() { + doMultiOverrideDirectoryTest(); + } + public void testInheritVisibilities() { doMultiOverrideFileTest(); }