[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
This commit is contained in:
Pavel Kirpichenkov
2025-04-24 13:29:40 +00:00
committed by intellij-monorepo-bot
parent de7d4de1c0
commit fa7c005ad9
2 changed files with 21 additions and 16 deletions
@@ -52,7 +52,7 @@ abstract class AbstractApplicabilityBasedInspection<TElement : KtElement>(
isOnTheFly,
inspectionHighlightType(element),
range,
LocalFix(this, fixText(element))
createQuickFix(element),
)
}
@@ -74,6 +74,10 @@ abstract class AbstractApplicabilityBasedInspection<TElement : KtElement>(
open val startFixInWriteAction: Boolean = true
open fun createQuickFix(element: TElement): LocalQuickFix {
return LocalFix(this, fixText(element))
}
private class LocalFix<TElement : KtElement>(
@FileModifier.SafeFieldForPreview val inspection: AbstractApplicabilityBasedInspection<TElement>,
@IntentionName val text: String
@@ -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<KtStringTemplateExpression, Unit>() {
override fun getProblemDescription(
element: KtStringTemplateExpression, context: Unit
): @InspectionMessage String =
internal class ConvertFromMultiDollarToRegularStringInspection :
AbstractApplicabilityBasedInspection<KtStringTemplateExpression>(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<KtStringTemplateExpression> {
override fun applyTo(element: KtStringTemplateExpression, project: Project, editor: Editor?) {
// createQuickFix is overridden
}
override fun createQuickFix(element: KtStringTemplateExpression): KotlinModCommandQuickFix<KtStringTemplateExpression> {
return object : KotlinModCommandQuickFix<KtStringTemplateExpression>() {
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
}