diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt index 08bf5e9fb02..f2e25ad2b63 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt @@ -200,12 +200,7 @@ internal fun KtPsiFactory.generateClassOrObjectByExpectedClass( val actualClass = createClassCopyByText(expectedClass) actualClass.declarations.forEach { - if (it.exists()) { - it.delete() - return@forEach - } when (it) { - is KtEnumEntry -> return@forEach is KtClassOrObject -> it.delete() is KtCallableDeclaration -> it.delete() } @@ -229,17 +224,16 @@ internal fun KtPsiFactory.generateClassOrObjectByExpectedClass( } } } - actualClass.replaceExpectModifier(actualNeeded) + if (actualClass !is KtEnumEntry) { + actualClass.replaceExpectModifier(actualNeeded) + } declLoop@ for (expectedDeclaration in expectedClass.declarations.filter { !it.exists() }) { val descriptor = expectedDeclaration.toDescriptor() ?: continue val actualDeclaration: KtDeclaration = when (expectedDeclaration) { - is KtClassOrObject -> - if (expectedDeclaration !is KtEnumEntry) { - generateClassOrObjectByExpectedClass(project, expectedDeclaration, actualNeeded = true) - } else { - continue@declLoop - } + is KtClassOrObject -> { + generateClassOrObjectByExpectedClass(project, expectedDeclaration, actualNeeded = true) + } is KtCallableDeclaration -> { when (expectedDeclaration) { is KtFunction -> generateFunction(project, expectedDeclaration, descriptor as FunctionDescriptor, actualClass) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt index f20c33f20b0..98cadda2cd6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.hasDeclarationOf +import org.jetbrains.kotlin.idea.util.isEffectivelyActual import org.jetbrains.kotlin.idea.util.liftToExpected import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName @@ -188,7 +189,6 @@ private fun KtPsiFactory.generateClassOrObjectByActualClass( val expectedClass = createClassCopyByText(actualClass) expectedClass.declarations.forEach { when (it) { - is KtEnumEntry -> return@forEach is KtClassOrObject -> it.delete() is KtCallableDeclaration -> it.delete() is KtAnonymousInitializer -> it.delete() @@ -214,14 +214,11 @@ private fun KtPsiFactory.generateClassOrObjectByActualClass( declLoop@ for (actualDeclaration in actualClass.declarations) { val descriptor = actualDeclaration.toDescriptor() ?: continue - if (!actualDeclaration.hasActualModifier()) continue@declLoop + if (!actualDeclaration.isEffectivelyActual()) continue@declLoop val expectedDeclaration: KtDeclaration = when (actualDeclaration) { - is KtClassOrObject -> - if (actualDeclaration !is KtEnumEntry) { - generateClassOrObjectByActualClass(project, actualDeclaration, outerExpectedClasses + expectedClass) - } else { - continue@declLoop - } + is KtClassOrObject -> { + generateClassOrObjectByActualClass(project, actualDeclaration, outerExpectedClasses + expectedClass) + } is KtCallableDeclaration -> { when (actualDeclaration) { is KtFunction -> diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt index c2cf98d63fa..067ab4ea259 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt @@ -49,14 +49,14 @@ fun createFileForDeclaration(module: Module, declaration: KtNamedDeclaration): K fun KtPsiFactory.createClassCopyByText(originalClass: KtClassOrObject): KtClassOrObject { val text = originalClass.text - return if (originalClass is KtObjectDeclaration) { - if (originalClass.isCompanion()) { + return when (originalClass) { + is KtObjectDeclaration -> if (originalClass.isCompanion()) { createCompanionObject(text) } else { createObject(text) } - } else { - createClass(text) + is KtEnumEntry -> createEnumEntry(text) + else -> createClass(text) } } diff --git a/idea/testData/multiModuleQuickFix/enum/js/MyEnum.kt.after b/idea/testData/multiModuleQuickFix/enum/js/MyEnum.kt.after index 4fd5693defe..1947d7d1e6a 100644 --- a/idea/testData/multiModuleQuickFix/enum/js/MyEnum.kt.after +++ b/idea/testData/multiModuleQuickFix/enum/js/MyEnum.kt.after @@ -1,8 +1,6 @@ // MyEnum: to be implemented actual enum class MyEnum { - FIRST, - SECOND, - LAST; + FIRST, SECOND, LAST; actual val num: Int get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. diff --git a/idea/testData/multiModuleQuickFix/expectEnum/header/My.kt.after b/idea/testData/multiModuleQuickFix/expectEnum/header/My.kt.after index d301b9d4571..cf56bfea9b8 100644 --- a/idea/testData/multiModuleQuickFix/expectEnum/header/My.kt.after +++ b/idea/testData/multiModuleQuickFix/expectEnum/header/My.kt.after @@ -1,8 +1,6 @@ // My: to be implemented // DISABLE-ERRORS expect enum class My { - FIRST, - SECOND, - LAST; + FIRST, SECOND, LAST; } \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/expectEnumComplex/common/Complex.kt.after b/idea/testData/multiModuleQuickFix/expectEnumComplex/common/Complex.kt.after new file mode 100644 index 00000000000..aec8ddf504b --- /dev/null +++ b/idea/testData/multiModuleQuickFix/expectEnumComplex/common/Complex.kt.after @@ -0,0 +1,7 @@ +expect enum class Complex { + FIRST { + }; + + abstract fun foo() + +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/expectEnumComplex/jvm/jvm.kt b/idea/testData/multiModuleQuickFix/expectEnumComplex/jvm/jvm.kt new file mode 100644 index 00000000000..d4167db1c1e --- /dev/null +++ b/idea/testData/multiModuleQuickFix/expectEnumComplex/jvm/jvm.kt @@ -0,0 +1,10 @@ +// "Create expected enum class in common module testModule_Common" "true" +// DISABLE-ERRORS + +actual enum class Complex { + FIRST { + override fun foo() {} + }; + + actual abstract fun foo() +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/expectEnumComplex/jvm/jvm.kt.after b/idea/testData/multiModuleQuickFix/expectEnumComplex/jvm/jvm.kt.after new file mode 100644 index 00000000000..bbcd087aa4a --- /dev/null +++ b/idea/testData/multiModuleQuickFix/expectEnumComplex/jvm/jvm.kt.after @@ -0,0 +1,10 @@ +// "Create expected enum class in common module testModule_Common" "true" +// DISABLE-ERRORS + +actual enum class Complex { + FIRST { + override fun foo() {} + }; + + actual abstract fun foo() +} \ 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 15fd5ddb32b..ec2aef714e6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -324,6 +324,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/expectEnum/"); } + @TestMetadata("expectEnumComplex") + public void testExpectEnumComplex() throws Exception { + runTest("idea/testData/multiModuleQuickFix/expectEnumComplex/"); + } + @TestMetadata("expectEnumEmpty") public void testExpectEnumEmpty() throws Exception { runTest("idea/testData/multiModuleQuickFix/expectEnumEmpty/");