diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/ImplementMembersHandler.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/ImplementMembersHandler.kt index daf0f9006f8..10c1e778bb1 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/ImplementMembersHandler.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/ImplementMembersHandler.kt @@ -24,6 +24,8 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.util.expectedDescriptors +import org.jetbrains.kotlin.js.descriptorUtils.hasPrimaryConstructor import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtEnumEntry @@ -32,7 +34,7 @@ import org.jetbrains.kotlin.resolve.OverrideResolver open class ImplementMembersHandler : OverrideImplementMembersHandler(), IntentionAction { override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection { return OverrideResolver.getMissingImplementations(descriptor) - .map { OverrideMemberChooserObject.create(project, it, it, OverrideMemberChooserObject.BodyType.EMPTY) } + .map { OverrideMemberChooserObject.create(project, it, it, OverrideMemberChooserObject.BodyType.EMPTY) } } override fun getChooserTitle() = "Implement Members" @@ -51,12 +53,20 @@ class ImplementAsConstructorParameter : ImplementMembersHandler() { override fun isValidForClass(classOrObject: KtClassOrObject): Boolean { if (classOrObject !is KtClass || classOrObject is KtEnumEntry || classOrObject.isInterface()) return false val classDescriptor = classOrObject.resolveToDescriptorIfAny() ?: return false + if (classDescriptor.isActual) { + if (classDescriptor.expectedDescriptors().any { + it is ClassDescriptor && it.hasPrimaryConstructor() + } + ) { + return false + } + } return OverrideResolver.getMissingImplementations(classDescriptor).any { it is PropertyDescriptor } } override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection { return OverrideResolver.getMissingImplementations(descriptor) - .filter { it is PropertyDescriptor } - .map { OverrideMemberChooserObject.create(project, it, it, OverrideMemberChooserObject.BodyType.EMPTY, true) } + .filter { it is PropertyDescriptor } + .map { OverrideMemberChooserObject.create(project, it, it, OverrideMemberChooserObject.BodyType.EMPTY, true) } } } \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/common/common.kt b/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/common/common.kt new file mode 100644 index 00000000000..a3ea0be8c4d --- /dev/null +++ b/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/common/common.kt @@ -0,0 +1,5 @@ +interface IFoo { + val a: Int +} + +expect class End : IFoo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/common/common.kt.after b/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/common/common.kt.after new file mode 100644 index 00000000000..a3ea0be8c4d --- /dev/null +++ b/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/common/common.kt.after @@ -0,0 +1,5 @@ +interface IFoo { + val a: Int +} + +expect class End : IFoo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/jvm/jvm.kt b/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/jvm/jvm.kt new file mode 100644 index 00000000000..8570b01ae56 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/jvm/jvm.kt @@ -0,0 +1,4 @@ +// "Implement as constructor parameters" "true" +// ERROR: Class 'End' is not abstract and does not implement abstract member public abstract val a: Int defined in IFoo + +actual class End : IFoo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/jvm/jvm.kt.after b/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/jvm/jvm.kt.after new file mode 100644 index 00000000000..ac523d6c619 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/jvm/jvm.kt.after @@ -0,0 +1,4 @@ +// "Implement as constructor parameters" "true" +// ERROR: Class 'End' is not abstract and does not implement abstract member public abstract val a: Int defined in IFoo + +actual class End(override val a: Int) : IFoo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/actualNoImplementAsConstructorParam/common/common.kt b/idea/testData/multiModuleQuickFix/actualNoImplementAsConstructorParam/common/common.kt new file mode 100644 index 00000000000..955627ee127 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/actualNoImplementAsConstructorParam/common/common.kt @@ -0,0 +1,5 @@ +interface IFoo { + val a: Int +} + +expect class End(i: Int) : IFoo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/actualNoImplementAsConstructorParam/jvm/jvm.kt b/idea/testData/multiModuleQuickFix/actualNoImplementAsConstructorParam/jvm/jvm.kt new file mode 100644 index 00000000000..9110a9384a0 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/actualNoImplementAsConstructorParam/jvm/jvm.kt @@ -0,0 +1,8 @@ +// "Implement as constructor parameters" "false" +// ERROR: Class 'End' is not abstract and does not implement abstract member public abstract val a: Int defined in IFoo +// ACTION: Create test +// ACTION: Implement members +// ACTION: Make 'End' abstract +// ACTION: Rename file to End.kt + +actual class End actual constructor(i: Int) : IFoo \ 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 4a6a49bbd55..008d633204e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -30,6 +30,16 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/abstract/"); } + @TestMetadata("actualImplementAsConstructorParam") + public void testActualImplementAsConstructorParam() throws Exception { + runTest("idea/testData/multiModuleQuickFix/actualImplementAsConstructorParam/"); + } + + @TestMetadata("actualNoImplementAsConstructorParam") + public void testActualNoImplementAsConstructorParam() throws Exception { + runTest("idea/testData/multiModuleQuickFix/actualNoImplementAsConstructorParam/"); + } + @TestMetadata("actualWithoutExpect") public void testActualWithoutExpect() throws Exception { runTest("idea/testData/multiModuleQuickFix/actualWithoutExpect/");