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 f20426dffd66..c9d8bb051f0d 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 @@ -170,6 +170,8 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(CallFromPublicInlineFixFactories.protectedCallFromPublicInlineErrorFixFactory) registerFactory(CallFromPublicInlineFixFactories.superCallFromPublicInlineFixFactory) registerFactory(ConfusingBranchConditionErrorFixFactories.wrapExpressionInParenthesesFixFactory) + registerFactory(WrapWithParenthesesFixFactories.suspendFixFactory) + registerFactory(WrapWithParenthesesFixFactories.suspendFunErrorFixFactory) } private val addAbstract = KtQuickFixesListBuilder.registerPsiQuickFix { diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/WrapWithParenthesesFixFactories.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/WrapWithParenthesesFixFactories.kt new file mode 100644 index 000000000000..f2019a2a27cd --- /dev/null +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/WrapWithParenthesesFixFactories.kt @@ -0,0 +1,33 @@ +// 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 com.intellij.psi.PsiElement +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.WrapWithParenthesesFix +import org.jetbrains.kotlin.psi.KtBinaryExpression +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +internal object WrapWithParenthesesFixFactories { + + val suspendFixFactory = KotlinQuickFixFactory.ModCommandBased { diagnostic: KaFirDiagnostic.ModifierFormForNonBuiltInSuspend -> + listOfNotNull( + createFixIfAvailable(diagnostic.psi) + ) + } + + val suspendFunErrorFixFactory = + KotlinQuickFixFactory.ModCommandBased { diagnostic: KaFirDiagnostic.ModifierFormForNonBuiltInSuspendFunError -> + listOfNotNull( + createFixIfAvailable(diagnostic.psi) + ) + } + + private fun createFixIfAvailable(element: PsiElement): WrapWithParenthesesFix? { + return element + .safeAs() + ?.takeIf { it.operationReference.text == "suspend" } + ?.right + ?.let { WrapWithParenthesesFix(it) } ?: return null + } +} 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 f43925d03220..96a04150a4f7 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 @@ -11225,7 +11225,29 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu } } + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/quickfix/wrapArgumentWithParentheses") + public static class WrapArgumentWithParentheses 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("ModifierFormForNonBuiltInSuspend.kt") + public void testModifierFormForNonBuiltInSuspend() throws Exception { + runTest("../../../idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspend.kt"); + } + + @TestMetadata("ModifierFormForNonBuiltInSuspendFun.kt") + public void testModifierFormForNonBuiltInSuspendFun() throws Exception { + runTest("../../../idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspendFun.kt"); + } + } @RunWith(JUnit3RunnerWithInners.class) @TestMetadata("../../../idea/tests/testData/quickfix/wrapWhenExpressionInParentheses") diff --git a/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspend.kt b/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspend.kt index 3561c84db4c6..2bdda7eb13f3 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspend.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspend.kt @@ -5,4 +5,5 @@ fun foo() { 1 suspend {} } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspend.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspend.kt.after index aea3eb8fd841..7c9c3aa579cc 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspend.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspend.kt.after @@ -5,4 +5,5 @@ fun foo() { 1 suspend ({}) } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspendFun.kt b/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspendFun.kt index 50949367ac71..25e46422b005 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspendFun.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspendFun.kt @@ -5,4 +5,5 @@ fun foo() { 1 suspend fun() {} } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspendFun.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspendFun.kt.after index d43262a60e7b..e53902eb5181 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspendFun.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/wrapArgumentWithParentheses/ModifierFormForNonBuiltInSuspendFun.kt.after @@ -5,4 +5,5 @@ fun foo() { 1 suspend (fun() {}) } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.WrapWithParenthesesFix \ 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 2fcd91449929..e53ac2e6467c 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 @@ -203,7 +203,7 @@ internal fun MutableTWorkspace.generateK2FixTests() { model("$idea/quickfix/variables", pattern = pattern, isRecursive = false, isIgnored = true) model("$idea/quickfix/variables/changeToPropertyAccess", pattern = pattern, isRecursive = false, isIgnored = true) model("$idea/quickfix/variables/changeToFunctionInvocation", pattern = pattern, isRecursive = false) - model("$idea/quickfix/wrapArgumentWithParentheses", pattern = pattern, isIgnored = true) + model("$idea/quickfix/wrapArgumentWithParentheses", pattern = pattern) model("$idea/quickfix/wrapWhenExpressionInParentheses", pattern = pattern) model("$idea/quickfix/wrongLongSuffix", pattern = pattern) model("$idea/quickfix/yieldUnsupported", pattern = pattern, isIgnored = true)