diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ChangeObjectToClassFixFactory.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ChangeObjectToClassFixFactory.kt new file mode 100644 index 000000000000..0e37b5913396 --- /dev/null +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ChangeObjectToClassFixFactory.kt @@ -0,0 +1,21 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.k2.codeinsight.fixes + +import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixFactory +import org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix +import org.jetbrains.kotlin.psi.KtConstructor +import org.jetbrains.kotlin.psi.KtObjectDeclaration +import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject + +internal object ChangeObjectToClassFixFactory { + + val changeObjectToClassFixFactory = KotlinQuickFixFactory.ModCommandBased { diagnostic: KaFirDiagnostic.ConstructorInObject -> + val element = diagnostic.psi as? KtConstructor<*> ?: return@ModCommandBased emptyList() + val containingObject = element.containingClassOrObject as? KtObjectDeclaration ?: return@ModCommandBased emptyList() + + listOf( + ChangeObjectToClassFix(containingObject) + ) + } +} diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt index f3ef148f7e2f..c92e316f439b 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt @@ -106,6 +106,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(ArgumentTypeMismatchFactory.wrapWithArrayLiteralFixFactory) registerFactory(ConvertLateinitPropertyToNotNullDelegateFixFactory.convertLateinitPropertyToNotNullDelegateFixFactory) registerFactory(AddReifiedToTypeParameterOfFunctionFixFactory.addReifiedToTypeParameterOfFunctionFixFactory) + registerFactory(ChangeObjectToClassFixFactory.changeObjectToClassFixFactory) } private val addAbstract = KtQuickFixesListBuilder.registerPsiQuickFix { diff --git a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java index 07da6f04f6d1..e3e74d03c615 100644 --- a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java +++ b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java @@ -5696,7 +5696,29 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/quickfix/changeObjectToClass") + public static class ChangeObjectToClass extends AbstractHighLevelQuickFixTest { + @java.lang.Override + @org.jetbrains.annotations.NotNull + public final KotlinPluginMode getPluginMode() { + return KotlinPluginMode.K2; + } + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + @TestMetadata("primaryConstructor.kt") + public void testPrimaryConstructor() throws Exception { + runTest("../../../idea/tests/testData/quickfix/changeObjectToClass/primaryConstructor.kt"); + } + + @TestMetadata("secondaryConstructor.kt") + public void testSecondaryConstructor() throws Exception { + runTest("../../../idea/tests/testData/quickfix/changeObjectToClass/secondaryConstructor.kt"); + } + } diff --git a/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/primaryConstructor.kt b/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/primaryConstructor.kt index dec757516b0f..7b5b8beaa410 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/primaryConstructor.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/primaryConstructor.kt @@ -6,4 +6,5 @@ annotation class Ann object Foo(val s: String) : Any() { constructor() : this("") } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/primaryConstructor.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/primaryConstructor.kt.after index d0d809d2e0a7..8c1950d7ebb6 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/primaryConstructor.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/primaryConstructor.kt.after @@ -6,4 +6,5 @@ annotation class Ann class Foo(val s: String) : Any() { constructor() : this("") } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/secondaryConstructor.kt b/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/secondaryConstructor.kt index 933bedbfee03..c09de168f79b 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/secondaryConstructor.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/secondaryConstructor.kt @@ -6,4 +6,5 @@ annotation class Ann object Foo(val s: String) : Any() { constructor() : this("") } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/secondaryConstructor.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/secondaryConstructor.kt.after index d0d809d2e0a7..8c1950d7ebb6 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/secondaryConstructor.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/changeObjectToClass/secondaryConstructor.kt.after @@ -6,4 +6,5 @@ annotation class Ann class Foo(val s: String) : Any() { constructor() : this("") } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeObjectToClassFix \ No newline at end of file diff --git a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt index 1417ac09b9bd..b5821345a731 100644 --- a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt +++ b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt @@ -93,7 +93,7 @@ internal fun MutableTWorkspace.generateK2FixTests() { model("$idea/quickfix/canBeParameter", pattern = pattern, isIgnored = true) model("$idea/quickfix/canBePrimaryConstructorProperty", pattern = pattern, isIgnored = true) model("$idea/quickfix/castDueToProgressionResolveChange", pattern = pattern, isIgnored = true) - model("$idea/quickfix/changeObjectToClass", pattern = pattern, isIgnored = true) + model("$idea/quickfix/changeObjectToClass", pattern = pattern) model("$idea/quickfix/changeSignature", pattern = pattern, isIgnored = true) model("$idea/quickfix/changeSuperTypeListEntryTypeArgument", pattern = pattern, isIgnored = true) model("$idea/quickfix/changeToLabeledReturn", pattern = pattern)