From 5a2d6bd5dfb929bd6d02869279467974ba8cb1fb Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Thu, 13 Feb 2025 14:35:07 +0100 Subject: [PATCH] [kotlin] Be more specific with ModCommand choose actions #KTIJ-33053 GitOrigin-RevId: 4340fc225f3a6670a7110b01e087c2b207c5139d --- .../daemon/quickFix/ActionHint.java | 6 ++- .../quickfix/AbstractQuickFixMultiFileTest.kt | 50 +++++++------------ .../AbstractQuickFixMultiModuleTest.kt | 3 +- .../changeVisibility/actual/jvm/Some.kt | 2 +- .../changeVisibility/actual/jvm/Some.kt.after | 2 +- 5 files changed, 26 insertions(+), 37 deletions(-) diff --git a/platform/testFramework/src/com/intellij/codeInsight/daemon/quickFix/ActionHint.java b/platform/testFramework/src/com/intellij/codeInsight/daemon/quickFix/ActionHint.java index b3354e090711..4cb71e0d6d5c 100644 --- a/platform/testFramework/src/com/intellij/codeInsight/daemon/quickFix/ActionHint.java +++ b/platform/testFramework/src/com/intellij/codeInsight/daemon/quickFix/ActionHint.java @@ -138,8 +138,10 @@ public final class ActionHint { if(myShouldPresent) { if(result == null) { fail(exceptionHeader(lastStep) + " not found\nAvailable actions: " + - commonActions.stream().map(ca -> { - return ca instanceof ModCommandAction mca && context != null ? Objects.requireNonNull(mca.getPresentation(context)).name() : + commonActions.stream() + .filter(ca -> !(ca instanceof ModCommandAction mca) || context != null && mca.getPresentation(context) != null) + .map(ca -> { + return ca instanceof ModCommandAction mca ? Objects.requireNonNull(mca.getPresentation(context)).name() : ca.asIntention().getText(); }).collect(Collectors.joining(", ", "[", "]\n")) + infoSupplier.get()); diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt index 0f862cb788a0..80177435ac67 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt @@ -6,15 +6,11 @@ import com.intellij.codeInsight.CodeInsightSettings import com.intellij.codeInsight.daemon.impl.HighlightInfo import com.intellij.codeInsight.daemon.quickFix.ActionHint import com.intellij.codeInsight.intention.IntentionAction -import com.intellij.codeInsight.intention.IntentionActionDelegate import com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler import com.intellij.codeInspection.InspectionEP import com.intellij.codeInspection.LocalInspectionEP import com.intellij.ide.highlighter.JavaFileType -import com.intellij.lang.impl.modcommand.ModCommandActionWrapper import com.intellij.modcommand.ActionContext -import com.intellij.modcommand.ModChooseAction -import com.intellij.modcommand.ModCommandWithContext import com.intellij.openapi.application.runReadAction import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.editor.Editor @@ -27,7 +23,6 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.platform.testFramework.core.FileComparisonFailedError import com.intellij.psi.PsiFile import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl -import com.intellij.testFramework.runInEdtAndWait import com.intellij.util.ArrayUtil import com.intellij.util.PathUtil import com.intellij.util.ThrowableRunnable @@ -169,6 +164,7 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest editor, actionShouldBeAvailable, getTestName(false), + null, this::availableActions, myFixture::doHighlighting, pluginMode = pluginMode, @@ -247,6 +243,7 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest editor, actionShouldBeAvailable, beforeFilePath, + null, this::availableActions, myFixture::doHighlighting, pluginMode = pluginMode, @@ -335,6 +332,7 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest editor: Editor, actionShouldBeAvailable: Boolean, testFilePath: String, + actionHint: ActionHint?, getAvailableActions: () -> List, doHighlighting: () -> List, shouldBeAvailableAfterExecution: Boolean = false, @@ -346,9 +344,21 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest } ) { val pattern = IntentionActionNamePattern(text) - val availableActions = getAvailableActions() - val action = pattern.findActionByPattern(availableActions, acceptMatchByFamilyName = !actionShouldBeAvailable) + val project = psiFile.project + val action = + if (actionHint != null) { + val actionContext = ActionContext.from(editor, psiFile) + project.computeOnBackground { + runReadAction { + actionHint.findAndCheck(availableActions, actionContext) { + "Intention action with text '$text' is not ${if (actionShouldBeAvailable) "available" else "not available"}" + } + } + } + } else { + pattern.findActionByPattern(availableActions, acceptMatchByFamilyName = !actionShouldBeAvailable) + } if (action == null) { if (actionShouldBeAvailable) { @@ -373,31 +383,7 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest TestCase.fail("Action '$text' is available (but must not) in test $testFilePath") } - - val unwrap = IntentionActionDelegate.unwrap(action) - if (unwrap is ModCommandActionWrapper) { - val modCommandAction = unwrap.asModCommandAction() - val actionContext = ActionContext.from(editor, psiFile) - val project = psiFile.project - project.computeOnBackground { - runReadAction { - val modCommand = modCommandAction.perform(actionContext) - if (modCommand is ModChooseAction) { - val firstAvailableChoose = modCommand.actions.firstOrNull { it.getPresentation(actionContext) != null } - firstAvailableChoose?.perform(actionContext) - } else { - modCommand - } - } - }?.let { command -> - val commandWithContext = ModCommandWithContext(actionContext, command) - runInEdtAndWait { - commandWithContext.executeInteractively(editor) - } - } - } else { - CodeInsightTestFixtureImpl.invokeIntention(action, psiFile, editor) - } + CodeInsightTestFixtureImpl.invokeIntention(action, psiFile, editor) if (!shouldBeAvailableAfterExecution) { val afterAction = pattern.findActionByPattern(getAvailableActions(), acceptMatchByFamilyName = true) diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt index c5493ac088b4..e8db141a1c13 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt @@ -121,6 +121,7 @@ abstract class AbstractQuickFixMultiModuleTest : AbstractMultiModuleTest(), Quic editor, actionShouldBeAvailable, actionFileName, + actionHint, this::availableActions, this::doHighlighting, pluginMode = pluginMode, @@ -179,7 +180,7 @@ abstract class AbstractQuickFixMultiModuleTest : AbstractMultiModuleTest(), Quic setActiveEditor(editedFile.findExistingEditor() ?: createEditor(editedFile.virtualFile)) try { checkResultByFile(afterFileInTestData.relativeTo(File(testDataPath)).path) - } catch (e: FileComparisonFailedError) { + } catch (_: FileComparisonFailedError) { KotlinTestUtils.assertEqualsToFile(afterFileInTestData, editor) } } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeVisibility/actual/jvm/Some.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeVisibility/actual/jvm/Some.kt index b07ed44b75c5..ce667868e5b0 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeVisibility/actual/jvm/Some.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeVisibility/actual/jvm/Some.kt @@ -1,4 +1,4 @@ -// "Change visibility…" "true" +// "Change visibility…|->internal" "true" // SHOULD_BE_AVAILABLE_AFTER_EXECUTION // IGNORE_K1 actual fun getPlatformName(): String { diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeVisibility/actual/jvm/Some.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeVisibility/actual/jvm/Some.kt.after index 7c82ec099be9..4ebedecdc233 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeVisibility/actual/jvm/Some.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeVisibility/actual/jvm/Some.kt.after @@ -1,4 +1,4 @@ -// "Change visibility…" "true" +// "Change visibility…|->internal" "true" // SHOULD_BE_AVAILABLE_AFTER_EXECUTION // IGNORE_K1 internal actual fun getPlatformName(): String {