diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index 535a310d121..d05dd26d800 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -122,8 +122,13 @@ fun OverrideMemberChooserObject.generateMember(targetClass: KtClassOrObject, cop } if (targetClass.hasActualModifier()) { - val expectClassDescriptors = targetClass.resolveToDescriptorIfAny()?.expectedDescriptors() ?: emptyList() - if (expectClassDescriptors.any { (it as? ClassDescriptor)?.findCallableMemberBySignature(immediateSuper)?.isExpect == true }) { + val expectClassDescriptors = + targetClass.resolveToDescriptorIfAny()?.expectedDescriptors()?.filterIsInstance().orEmpty() + if (expectClassDescriptors.any { expectClassDescriptor -> + val expectMemberDescriptor = expectClassDescriptor.findCallableMemberBySignature(immediateSuper) + expectMemberDescriptor?.isExpect == true && expectMemberDescriptor.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE + } + ) { newMember.addModifier(KtTokens.ACTUAL_KEYWORD) } } else { diff --git a/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/common/common.kt b/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/common/common.kt new file mode 100644 index 00000000000..eb8e7a5631d --- /dev/null +++ b/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/common/common.kt @@ -0,0 +1,5 @@ +expect interface ExpInterface { + fun first() +} + +expect class ExpImpl : ExpInterface { } \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/common/common.kt.after b/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/common/common.kt.after new file mode 100644 index 00000000000..eb8e7a5631d --- /dev/null +++ b/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/common/common.kt.after @@ -0,0 +1,5 @@ +expect interface ExpInterface { + fun first() +} + +expect class ExpImpl : ExpInterface { } \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/jvm/jvm.kt b/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/jvm/jvm.kt new file mode 100644 index 00000000000..41e9356e117 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/jvm/jvm.kt @@ -0,0 +1,8 @@ +// "Implement members" "true" +// ERROR: Class 'ExpImpl' is not abstract and does not implement abstract member public abstract actual fun first(): Unit defined in ExpInterface + +actual interface ExpInterface { + actual fun first() +} + +actual class ExpImpl : ExpInterface \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/jvm/jvm.kt.after b/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/jvm/jvm.kt.after new file mode 100644 index 00000000000..d6ccf9ecd08 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/jvm/jvm.kt.after @@ -0,0 +1,12 @@ +// "Implement members" "true" +// ERROR: Class 'ExpImpl' is not abstract and does not implement abstract member public abstract actual fun first(): Unit defined in ExpInterface + +actual interface ExpInterface { + actual fun first() +} + +actual class ExpImpl : ExpInterface { + override fun first() { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index e2ff8b0a0f6..299508a247d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -229,6 +229,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/implementAbstractExpectMemberInheritedFromInterface/"); } + @TestMetadata("implementMembersInActualClassNoExpectMember") + public void testImplementMembersInActualClassNoExpectMember() throws Exception { + runTest("idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/"); + } + @TestMetadata("implementMembersInImplClassNonImplInheritor") public void testImplementMembersInImplClassNonImplInheritor() throws Exception { runTest("idea/testData/multiModuleQuickFix/implementMembersInImplClassNonImplInheritor/");