From e455e926aad35a792cc86c01e288a0cd3b8122d9 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 11 Mar 2020 19:21:48 +0900 Subject: [PATCH] Implement members: fix it works correctly if primary constructor has implemented member #KT-37312 Fixed --- .../OverrideImplementMembersHandler.kt | 3 ++- .../hasImplementedInPrimaryConstructor.kt | 10 ++++++++++ .../hasImplementedInPrimaryConstructor.kt.after | 14 ++++++++++++++ .../hasImplementedInPrimaryConstructor2.kt | 11 +++++++++++ .../hasImplementedInPrimaryConstructor2.kt.after | 14 ++++++++++++++ .../hasImplementedInPrimaryConstructor3.kt | 13 +++++++++++++ .../hasImplementedInPrimaryConstructor3.kt.after | 16 ++++++++++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 15 +++++++++++++++ 8 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor.kt create mode 100644 idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor.kt.after create mode 100644 idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor2.kt create mode 100644 idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor2.kt.after create mode 100644 idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor3.kt create mode 100644 idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor3.kt.after diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideImplementMembersHandler.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideImplementMembersHandler.kt index 1df706cc558..b0caaeac525 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideImplementMembersHandler.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideImplementMembersHandler.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.prevSiblingOfSameType import org.jetbrains.kotlin.psi.psiUtil.startOffset @@ -147,7 +148,7 @@ abstract class OverrideImplementMembersHandler : LanguageCodeInsightActionHandle fun ClassDescriptor.findElement(memberDescriptor: CallableMemberDescriptor): KtDeclaration? { return implementedElements[memberDescriptor] ?: (findCallableMemberBySignature(memberDescriptor)?.source?.getPsi() as? KtDeclaration) - ?.takeIf { it != classOrObject } + ?.takeIf { it != classOrObject && it !is KtParameter } ?.also { implementedElements[memberDescriptor] = it } } diff --git a/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor.kt b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor.kt new file mode 100644 index 00000000000..898edb7541a --- /dev/null +++ b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor.kt @@ -0,0 +1,10 @@ +// "Implement members" "true" +// WITH_RUNTIME +abstract class B { + abstract val p: String? + abstract fun test() +} + +class MyImpl( + override val p: String? = null +) : B() \ No newline at end of file diff --git a/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor.kt.after b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor.kt.after new file mode 100644 index 00000000000..51a08e1605d --- /dev/null +++ b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor.kt.after @@ -0,0 +1,14 @@ +// "Implement members" "true" +// WITH_RUNTIME +abstract class B { + abstract val p: String? + abstract fun test() +} + +class MyImpl( + override val p: String? = null +) : B() { + override fun test() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor2.kt b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor2.kt new file mode 100644 index 00000000000..e1f401e2813 --- /dev/null +++ b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor2.kt @@ -0,0 +1,11 @@ +// "Implement members" "true" +// WITH_RUNTIME +abstract class B { + abstract val p: String? + abstract fun test() +} + +class MyImpl2( + override val p: String? = null +) : B() { +} \ No newline at end of file diff --git a/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor2.kt.after b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor2.kt.after new file mode 100644 index 00000000000..3fd37ff20e4 --- /dev/null +++ b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor2.kt.after @@ -0,0 +1,14 @@ +// "Implement members" "true" +// WITH_RUNTIME +abstract class B { + abstract val p: String? + abstract fun test() +} + +class MyImpl2( + override val p: String? = null +) : B() { + override fun test() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor3.kt b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor3.kt new file mode 100644 index 00000000000..fa10a41588c --- /dev/null +++ b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor3.kt @@ -0,0 +1,13 @@ +// "Implement members" "true" +// WITH_RUNTIME +abstract class C { + abstract val p: String? + abstract val q: Int + abstract fun test() +} + +class MyImpl3( + override val p: String? = null +) : C() { + override val q: Int = 0 +} \ No newline at end of file diff --git a/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor3.kt.after b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor3.kt.after new file mode 100644 index 00000000000..360264816e8 --- /dev/null +++ b/idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor3.kt.after @@ -0,0 +1,16 @@ +// "Implement members" "true" +// WITH_RUNTIME +abstract class C { + abstract val p: String? + abstract val q: Int + abstract fun test() +} + +class MyImpl3( + override val p: String? = null +) : C() { + override val q: Int = 0 + override fun test() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index ff100302dde..183f89b8fd5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7714,6 +7714,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/implement/finalClass.kt"); } + @TestMetadata("hasImplementedInPrimaryConstructor.kt") + public void testHasImplementedInPrimaryConstructor() throws Exception { + runTest("idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor.kt"); + } + + @TestMetadata("hasImplementedInPrimaryConstructor2.kt") + public void testHasImplementedInPrimaryConstructor2() throws Exception { + runTest("idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor2.kt"); + } + + @TestMetadata("hasImplementedInPrimaryConstructor3.kt") + public void testHasImplementedInPrimaryConstructor3() throws Exception { + runTest("idea/testData/quickfix/implement/hasImplementedInPrimaryConstructor3.kt"); + } + @TestMetadata("inCompanion.kt") public void testInCompanion() throws Exception { runTest("idea/testData/quickfix/implement/inCompanion.kt");