From cc4c62230f50f17120885acadacf03b34abfe2c7 Mon Sep 17 00:00:00 2001 From: Andrey Cherkasov Date: Mon, 9 Sep 2024 00:35:07 +0400 Subject: [PATCH] [kotlin] Port `AddAnnotationUseSiteTargetFix` to K2 ^KTIJ-29573 GitOrigin-RevId: 181131d6870b049ce4e693cd9e80370523f8ca35 --- .../fixes/KotlinK2QuickFixRegistrar.kt | 1 + .../WrongAnnotationTargetFixFactories.kt | 46 +++++++++++++++++++ .../fixes/HighLevelQuickFixTestGenerated.java | 22 +++++++++ .../addAnnotationUseSiteTarget/delegate.kt | 3 +- .../delegate.kt.after | 3 +- .../addAnnotationUseSiteTarget/get.kt | 3 +- .../addAnnotationUseSiteTarget/get.kt.after | 3 +- .../codeinsight/GenerateK2QuickFixTests.kt | 2 +- 8 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/WrongAnnotationTargetFixFactories.kt 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 ea5662f7d80f..255e3d35b3e5 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 @@ -173,6 +173,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(WrapWithParenthesesFixFactories.suspendFixFactory) registerFactory(WrapWithParenthesesFixFactories.suspendFunErrorFixFactory) registerFactory(DeclarationCantBeInlinedFixFactories.removeOpenModifierFixFactory) + registerFactory(WrongAnnotationTargetFixFactories.addAnnotationUseSiteTargetFixFactory) } private val addAbstract = KtQuickFixesListBuilder.registerPsiQuickFix { diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/WrongAnnotationTargetFixFactories.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/WrongAnnotationTargetFixFactories.kt new file mode 100644 index 000000000000..658746cf83dd --- /dev/null +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/WrongAnnotationTargetFixFactories.kt @@ -0,0 +1,46 @@ +// 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.modcommand.ActionContext +import com.intellij.modcommand.ModPsiUpdater +import com.intellij.modcommand.PsiUpdateModCommandAction +import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget +import org.jetbrains.kotlin.idea.base.resources.KotlinBundle +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixFactory +import org.jetbrains.kotlin.idea.codeinsights.impl.base.intentions.AddAnnotationUseSiteTargetUtils.addUseSiteTarget +import org.jetbrains.kotlin.idea.codeinsights.impl.base.intentions.AddAnnotationUseSiteTargetUtils.getApplicableUseSiteTargets +import org.jetbrains.kotlin.psi.KtAnnotationEntry + +internal object WrongAnnotationTargetFixFactories { + + val addAnnotationUseSiteTargetFixFactory = KotlinQuickFixFactory.ModCommandBased { diagnostic: KaFirDiagnostic.WrongAnnotationTarget -> + val applicableUseSiteTargets = diagnostic.psi.getApplicableUseSiteTargets() + + listOfNotNull( + AddAnnotationUseSiteTargetFix(diagnostic.psi, applicableUseSiteTargets) + ) + } + + private class AddAnnotationUseSiteTargetFix( + element: KtAnnotationEntry, + private val useSiteTargets: List, + ) : PsiUpdateModCommandAction(element) { + + override fun getFamilyName(): String { + return if (useSiteTargets.size == 1) { + KotlinBundle.message("text.add.use.site.target.0", useSiteTargets.first().renderName) + } else { + KotlinBundle.message("add.use.site.target") + } + } + + override fun invoke( + context: ActionContext, + element: KtAnnotationEntry, + updater: ModPsiUpdater, + ) { + element.addUseSiteTarget(useSiteTargets, 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 36282b30e737..e0c37ae929f0 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 @@ -5618,7 +5618,29 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/quickfix/addAnnotationUseSiteTarget") + public static class AddAnnotationUseSiteTarget 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("delegate.kt") + public void testDelegate() throws Exception { + runTest("../../../idea/tests/testData/quickfix/addAnnotationUseSiteTarget/delegate.kt"); + } + + @TestMetadata("get.kt") + public void testGet() throws Exception { + runTest("../../../idea/tests/testData/quickfix/addAnnotationUseSiteTarget/get.kt"); + } + } diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/delegate.kt b/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/delegate.kt index c9e2f7f602c1..73bf70903209 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/delegate.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/delegate.kt @@ -12,4 +12,5 @@ class Abcd { @Anno var a by Abcd() -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationUseSiteTargetFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationUseSiteTargetFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.k2.codeinsight.fixes.WrongAnnotationTargetFixFactories$AddAnnotationUseSiteTargetFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/delegate.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/delegate.kt.after index f1c2c843f88b..d80b22245b94 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/delegate.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/delegate.kt.after @@ -12,4 +12,5 @@ class Abcd { @delegate:Anno var a by Abcd() -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationUseSiteTargetFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationUseSiteTargetFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.k2.codeinsight.fixes.WrongAnnotationTargetFixFactories$AddAnnotationUseSiteTargetFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/get.kt b/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/get.kt index 3c792033ac21..67933750f868 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/get.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/get.kt @@ -5,4 +5,5 @@ annotation class Anno2 @Anno2 var b = 42 -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationUseSiteTargetFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationUseSiteTargetFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.k2.codeinsight.fixes.WrongAnnotationTargetFixFactories$AddAnnotationUseSiteTargetFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/get.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/get.kt.after index 7586cd363a01..b231ab57760d 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/get.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/addAnnotationUseSiteTarget/get.kt.after @@ -5,4 +5,5 @@ annotation class Anno2 @get:Anno2 var b = 42 -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationUseSiteTargetFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationUseSiteTargetFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.k2.codeinsight.fixes.WrongAnnotationTargetFixFactories$AddAnnotationUseSiteTargetFix \ 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 c29c530be245..5750838034d2 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 @@ -61,7 +61,7 @@ internal fun MutableTWorkspace.generateK2FixTests() { model("$idea/quickfix/supertypeInitialization", pattern = pattern) model("$idea/quickfix/dataClassConstructorVsCopyVisibility", pattern = pattern) model("$idea/quickfix/addAnnotationTarget", pattern = pattern, isIgnored = true) - model("$idea/quickfix/addAnnotationUseSiteTarget", pattern = pattern, isIgnored = true) + model("$idea/quickfix/addAnnotationUseSiteTarget", pattern = pattern) model("$idea/quickfix/addConstructorParameter", pattern = pattern, isIgnored = true) model("$idea/quickfix/addConstructorParameterFromSuperTypeCall", pattern = pattern) model("$idea/quickfix/addConversionCall", pattern = pattern)