From fa7c005ad92a876e262dd4f581fe834fabd024ff Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Thu, 24 Apr 2025 14:49:42 +0300 Subject: [PATCH] [Kotlin] K2 Don't call analysis in a PSI-only inspection Allow passing mod command quick fix in AbstractApplicabilityBasedInspection. Use it in the inspection that removes an interpolation prefix as it doesn't require analysis via Analysis API. KTIJ-33578 GitOrigin-RevId: 0968876cde5c7fdc50a3556da13425a4dba07329 --- .../AbstractApplicabilityBasedInspection.kt | 6 +++- ...romMultiDollarToRegularStringInspection.kt | 31 ++++++++++--------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/classic/inspections/AbstractApplicabilityBasedInspection.kt b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/classic/inspections/AbstractApplicabilityBasedInspection.kt index 8658f16b04a8..391f1f7107d0 100644 --- a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/classic/inspections/AbstractApplicabilityBasedInspection.kt +++ b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/classic/inspections/AbstractApplicabilityBasedInspection.kt @@ -52,7 +52,7 @@ abstract class AbstractApplicabilityBasedInspection( isOnTheFly, inspectionHighlightType(element), range, - LocalFix(this, fixText(element)) + createQuickFix(element), ) } @@ -74,6 +74,10 @@ abstract class AbstractApplicabilityBasedInspection( open val startFixInWriteAction: Boolean = true + open fun createQuickFix(element: TElement): LocalQuickFix { + return LocalFix(this, fixText(element)) + } + private class LocalFix( @FileModifier.SafeFieldForPreview val inspection: AbstractApplicabilityBasedInspection, @IntentionName val text: String diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ConvertFromMultiDollarToRegularStringInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ConvertFromMultiDollarToRegularStringInspection.kt index e3241d5379cb..1c106a194ba5 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ConvertFromMultiDollarToRegularStringInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ConvertFromMultiDollarToRegularStringInspection.kt @@ -3,16 +3,15 @@ package org.jetbrains.kotlin.idea.k2.codeinsight.inspections import com.intellij.codeInspection.ProblemsHolder -import com.intellij.codeInspection.util.InspectionMessage import com.intellij.codeInspection.util.IntentionFamilyName import com.intellij.modcommand.ModPsiUpdater +import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.analysis.api.KaSession import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.idea.base.projectStructure.languageVersionSettings import org.jetbrains.kotlin.idea.base.resources.KotlinBundle -import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.KotlinApplicableInspectionBase import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.KotlinModCommandQuickFix +import org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.AbstractApplicabilityBasedInspection import org.jetbrains.kotlin.idea.codeinsights.impl.base.convertToStringWithoutPrefix import org.jetbrains.kotlin.idea.codeinsights.impl.base.simplifyDollarEntries import org.jetbrains.kotlin.psi.KtStringTemplateExpression @@ -24,24 +23,28 @@ import org.jetbrains.kotlin.psi.KtVisitorVoid * * Removes the interpolation prefix from string literals and updates their content to preserve the meaning. */ -internal class ConvertFromMultiDollarToRegularStringInspection : KotlinApplicableInspectionBase.Simple() { - override fun getProblemDescription( - element: KtStringTemplateExpression, context: Unit - ): @InspectionMessage String = +internal class ConvertFromMultiDollarToRegularStringInspection : + AbstractApplicabilityBasedInspection(KtStringTemplateExpression::class.java) { + + override fun inspectionText(element: KtStringTemplateExpression): String = KotlinBundle.message("inspection.remove.interpolation.prefix.problem.description") - override fun isApplicableByPsi(element: KtStringTemplateExpression): Boolean { + override val defaultFixText: String + get() = KotlinBundle.message("inspection.remove.interpolation.prefix.quick.fix.text") + + override fun isApplicable(element: KtStringTemplateExpression): Boolean { if (!element.languageVersionSettings.supportsFeature(LanguageFeature.MultiDollarInterpolation)) return false if (element.interpolationPrefix == null) return false return true } - override fun createQuickFix( - element: KtStringTemplateExpression, context: Unit - ): KotlinModCommandQuickFix { + override fun applyTo(element: KtStringTemplateExpression, project: Project, editor: Editor?) { + // createQuickFix is overridden + } + + override fun createQuickFix(element: KtStringTemplateExpression): KotlinModCommandQuickFix { return object : KotlinModCommandQuickFix() { - override fun getFamilyName(): @IntentionFamilyName String = - KotlinBundle.message("inspection.remove.interpolation.prefix.quick.fix.text") + override fun getFamilyName(): @IntentionFamilyName String = defaultFixText override fun applyFix( project: Project, @@ -62,6 +65,4 @@ internal class ConvertFromMultiDollarToRegularStringInspection : KotlinApplicabl visitTargetElement(expression, holder, isOnTheFly) } } - - override fun KaSession.prepareContext(element: KtStringTemplateExpression): Unit? = Unit } \ No newline at end of file