[kotlin] Extend AbstractKotlinInspection instead of AbstractApplicabilityBasedInspection

This allows providing a quick fix that uses the ModCommand API without introducing additional methods, such as `createQuickFix`, which was previously introduced.

IJ-CR-158410
#KTIJ-33578

GitOrigin-RevId: 23ab404e18e2ace5470248aa73db2691226abba1
This commit is contained in:
Andrey Cherkasov
2025-09-04 15:21:04 +00:00
committed by intellij-monorepo-bot
parent 670c9b1cd8
commit e32e8e6fd3
2 changed files with 22 additions and 21 deletions
@@ -64,7 +64,7 @@ abstract class AbstractApplicabilityBasedInspection<TElement : KtElement>(
isOnTheFly,
inspectionHighlightType(element),
range,
createQuickFix(element),
LocalFix(this, fixText(element)),
)
}
@@ -86,10 +86,6 @@ 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
@@ -2,46 +2,51 @@
package org.jetbrains.kotlin.idea.k2.codeinsight.inspections
import com.intellij.codeInspection.ProblemsHolder
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.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.KotlinModCommandQuickFix
import org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.AbstractApplicabilityBasedInspection
import org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.AbstractKotlinInspection
import org.jetbrains.kotlin.idea.codeinsights.impl.base.convertToStringWithoutPrefix
import org.jetbrains.kotlin.idea.codeinsights.impl.base.simplifyDollarEntries
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
import org.jetbrains.kotlin.psi.KtVisitorVoid
/**
* Intention-like inspection with [com.intellij.codeInspection.ProblemHighlightType.INFORMATION] level to allow applying the conversion for the whole project.
*
* Removes the interpolation prefix from string literals and updates their content to preserve the meaning.
*/
internal class ConvertFromMultiDollarToRegularStringInspection :
AbstractApplicabilityBasedInspection<KtStringTemplateExpression>(KtStringTemplateExpression::class.java) {
internal class ConvertFromMultiDollarToRegularStringInspection : AbstractKotlinInspection() {
override fun buildVisitor(
holder: ProblemsHolder,
isOnTheFly: Boolean
): KtVisitorVoid = object : KtVisitorVoid() {
override fun visitStringTemplateExpression(expression: KtStringTemplateExpression) {
if (!isApplicable(expression)) return
override fun inspectionText(element: KtStringTemplateExpression): String =
KotlinBundle.message("inspection.remove.interpolation.prefix.problem.description")
holder.registerProblem(
expression,
KotlinBundle.message("inspection.remove.interpolation.prefix.problem.description"),
createQuickFix(),
)
}
}
override val defaultFixText: String
get() = KotlinBundle.message("inspection.remove.interpolation.prefix.quick.fix.text")
override fun isApplicable(element: KtStringTemplateExpression): Boolean {
private fun isApplicable(element: KtStringTemplateExpression): Boolean {
if (!element.languageVersionSettings.supportsFeature(LanguageFeature.MultiDollarInterpolation)) return false
if (element.interpolationPrefix == null) return false
return true
}
override fun applyTo(element: KtStringTemplateExpression, project: Project, editor: Editor?) {
// createQuickFix is overridden
}
override fun createQuickFix(element: KtStringTemplateExpression): KotlinModCommandQuickFix<KtStringTemplateExpression> {
private fun createQuickFix(): KotlinModCommandQuickFix<KtStringTemplateExpression> {
return object : KotlinModCommandQuickFix<KtStringTemplateExpression>() {
override fun getFamilyName(): @IntentionFamilyName String = defaultFixText
override fun getFamilyName(): @IntentionFamilyName String =
KotlinBundle.message("inspection.remove.interpolation.prefix.quick.fix.text")
override fun applyFix(
project: Project,