From 1264247d843ac420922ee001ba913d7dd27fcde3 Mon Sep 17 00:00:00 2001 From: Andrey Cherkasov Date: Mon, 29 Jul 2024 21:25:22 +0400 Subject: [PATCH] [kotlin] Port AddJvmStaticAnnotationFix to K2 ^KTIJ-29549 GitOrigin-RevId: 0348c83d1586fc3287ba61b37d6addbca8f7bbbb --- .../fixes/KotlinK2QuickFixRegistrar.kt | 1 + ...llCompanionProtectedNonStaticFixFactory.kt | 18 +++++++++++++++ .../fixes/HighLevelQuickFixTestGenerated.java | 22 +++++++++++++++++++ .../quickfix/AddJvmStaticAnnotationFix.kt | 15 +++++++++++++ .../AddJvmStaticAnnotationFixFactory.kt | 11 +--------- .../addJvmStaticAnnotation/function.kt | 3 ++- .../addJvmStaticAnnotation/function.kt.after | 3 ++- .../addJvmStaticAnnotation/property.kt | 3 ++- .../addJvmStaticAnnotation/property.kt.after | 3 ++- .../codeinsight/GenerateK2QuickFixTests.kt | 2 +- 10 files changed, 66 insertions(+), 15 deletions(-) create mode 100644 plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/SubclassCantCallCompanionProtectedNonStaticFixFactory.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 11a7ef1771ae..972b46f6bd58 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 @@ -138,6 +138,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(MisplacedTypeParameterConstraintsFixFactory.moveConstraintToWhereClause) registerFactory(AbstractFunctionWithBodyFixFactory.removeFunctionBody) registerFactory(SenselessNullInWhenFixFactory.removeCondition) + registerFactory(SubclassCantCallCompanionProtectedNonStaticFixFactory.addJvmStaticAnnotation) } private val addAbstract = KtQuickFixesListBuilder.registerPsiQuickFix { diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/SubclassCantCallCompanionProtectedNonStaticFixFactory.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/SubclassCantCallCompanionProtectedNonStaticFixFactory.kt new file mode 100644 index 000000000000..5a3a108a67fb --- /dev/null +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/SubclassCantCallCompanionProtectedNonStaticFixFactory.kt @@ -0,0 +1,18 @@ +// 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.AddJvmStaticAnnotationFix +import org.jetbrains.kotlin.psi.KtNameReferenceExpression + +internal object SubclassCantCallCompanionProtectedNonStaticFixFactory { + + val addJvmStaticAnnotation = KotlinQuickFixFactory.IntentionBased { diagnostic: KaFirDiagnostic.SubclassCantCallCompanionProtectedNonStatic -> + val nameReference = diagnostic.psi as? KtNameReferenceExpression ?: return@IntentionBased emptyList() + + listOfNotNull( + AddJvmStaticAnnotationFix.createIfApplicable(nameReference) + ) + } +} 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 e597a79dfaac..3469b5808e55 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 @@ -6112,7 +6112,29 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu } } + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/quickfix/addJvmStaticAnnotation") + public static class AddJvmStaticAnnotation 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("function.kt") + public void testFunction() throws Exception { + runTest("../../../idea/tests/testData/quickfix/addJvmStaticAnnotation/function.kt"); + } + + @TestMetadata("property.kt") + public void testProperty() throws Exception { + runTest("../../../idea/tests/testData/quickfix/addJvmStaticAnnotation/property.kt"); + } + } diff --git a/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/AddJvmStaticAnnotationFix.kt b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/AddJvmStaticAnnotationFix.kt index 653e810170fe..35b00eaf92b2 100644 --- a/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/AddJvmStaticAnnotationFix.kt +++ b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/AddJvmStaticAnnotationFix.kt @@ -1,9 +1,13 @@ // 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.quickfix +import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtNameReferenceExpression +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.KtProperty class AddJvmStaticAnnotationFix(declaration: KtCallableDeclaration) : AddAnnotationFix( declaration, @@ -11,4 +15,15 @@ class AddJvmStaticAnnotationFix(declaration: KtCallableDeclaration) : AddAnnotat Kind.Declaration(declaration.nameAsSafeName.asString()) ) { override fun getFamilyName(): String = text + + companion object { + fun createIfApplicable(element: KtNameReferenceExpression): AddJvmStaticAnnotationFix? { + val resolved = element.mainReference.resolve() ?: return null + return if (resolved is KtProperty || resolved is KtNamedFunction) { + AddJvmStaticAnnotationFix(resolved as KtCallableDeclaration) + } else { + null + } + } + } } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AddJvmStaticAnnotationFixFactory.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AddJvmStaticAnnotationFixFactory.kt index 066687dfcefe..29601227d9e3 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AddJvmStaticAnnotationFixFactory.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AddJvmStaticAnnotationFixFactory.kt @@ -3,20 +3,11 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.intention.IntentionAction import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtNameReferenceExpression -import org.jetbrains.kotlin.psi.KtNamedFunction -import org.jetbrains.kotlin.psi.KtProperty internal object AddJvmStaticAnnotationFixFactory : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { val nameReference = diagnostic.psiElement as? KtNameReferenceExpression ?: return null - val resolved = nameReference.mainReference.resolve() ?: return null - return if (resolved is KtProperty || resolved is KtNamedFunction) { - AddJvmStaticAnnotationFix(resolved as KtCallableDeclaration) - } else { - null - } + return AddJvmStaticAnnotationFix.createIfApplicable(nameReference) } } diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/function.kt b/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/function.kt index 09859090c08c..5efd86b6248e 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/function.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/function.kt @@ -12,4 +12,5 @@ class B : A() { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/function.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/function.kt.after index 7cf2a923135c..d90b0ff85278 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/function.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/function.kt.after @@ -13,4 +13,5 @@ class B : A() { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/property.kt b/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/property.kt index f57640432305..4d4d5a9dc696 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/property.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/property.kt @@ -12,4 +12,5 @@ class B : A() { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/property.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/property.kt.after index e2c27294c669..cd7577563bb0 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/property.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/addJvmStaticAnnotation/property.kt.after @@ -13,4 +13,5 @@ class B : A() { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddJvmStaticAnnotationFix \ 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 6b9a075c4891..590c0d499246 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 @@ -76,7 +76,7 @@ internal fun MutableTWorkspace.generateK2FixTests() { model("$idea/quickfix/addInlineToReifiedFunctionFix", pattern = pattern) model("$idea/quickfix/addIsToWhenCondition", pattern = pattern) model("$idea/quickfix/addJvmInline", pattern = pattern) - model("$idea/quickfix/addJvmStaticAnnotation", pattern = pattern, isIgnored = true) + model("$idea/quickfix/addJvmStaticAnnotation", pattern = pattern) model("$idea/quickfix/addNewLineAfterAnnotations", pattern = pattern, isIgnored = true) model("$idea/quickfix/addNoinline", pattern = pattern) model("$idea/quickfix/addReifiedToTypeParameterOfFunctionFix", pattern = pattern)