From 6c52d95342ed89872b42fc5db74d6108297c9e9b Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Mon, 22 Mar 2021 16:56:28 -0700 Subject: [PATCH] FIR IDE: remove type parameter `TARGET_PSI` and `INPUT` The factory does not need to care about what target PSI and input a quick fix should need. We only need to ensure these two types match when an `HLQuickfix` is created. With this constraint loosened, now one factory can register multiple quickfixes applied on different targets and different input. This makes it much more flexible when implementing quickfixes. --- .../fir/api/fixes/HLDiagnosticFixFactory.kt | 24 +++++++++---------- .../idea/fir/api/fixes/KtQuickFixesList.kt | 14 +++++------ .../quickfix/fixes/ReplaceCallFixFactories.kt | 2 +- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLDiagnosticFixFactory.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLDiagnosticFixFactory.kt index cf36d95d444..d9a1d71defd 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLDiagnosticFixFactory.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLDiagnosticFixFactory.kt @@ -12,28 +12,28 @@ import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi -sealed class HLDiagnosticFixFactory, TARGET_PSI : PsiElement, INPUT : HLApplicatorInput> { - abstract fun KtAnalysisSession.createQuickFixes(diagnostic: DIAGNOSTIC): List> +sealed class HLDiagnosticFixFactory> { + abstract fun KtAnalysisSession.createQuickFixes(diagnostic: DIAGNOSTIC): List> } private class HLDiagnosticFixFactoryWithFixedApplicator, TARGET_PSI : PsiElement, INPUT : HLApplicatorInput>( private val applicator: HLApplicator, private val createTargets: KtAnalysisSession.(DIAGNOSTIC) -> List> -) : HLDiagnosticFixFactory() { +) : HLDiagnosticFixFactory() { override fun KtAnalysisSession.createQuickFixes(diagnostic: DIAGNOSTIC): List> = createTargets.invoke(this, diagnostic).map { (target, input) -> HLQuickFix(target, input, applicator) } } -private class HLDiagnosticFixFactoryWithVariableApplicator, TARGET_PSI : PsiElement, INPUT : HLApplicatorInput>( - private val createQuickFixes: KtAnalysisSession.(DIAGNOSTIC) -> List> -) : HLDiagnosticFixFactory() { - override fun KtAnalysisSession.createQuickFixes(diagnostic: DIAGNOSTIC): List> = +private class HLDiagnosticFixFactoryWithVariableApplicator>( + private val createQuickFixes: KtAnalysisSession.(DIAGNOSTIC) -> List> +) : HLDiagnosticFixFactory() { + override fun KtAnalysisSession.createQuickFixes(diagnostic: DIAGNOSTIC): List> = createQuickFixes.invoke(this, diagnostic) } internal fun > KtAnalysisSession.createPlatformQuickFixes( diagnostic: DIAGNOSTIC, - factory: HLDiagnosticFixFactory + factory: HLDiagnosticFixFactory ): List = with(factory) { createQuickFixes(diagnostic) } /** @@ -43,13 +43,13 @@ internal fun > KtAnalysisSession.cr fun , TARGET_PSI : PsiElement, INPUT : HLApplicatorInput> diagnosticFixFactory( applicator: HLApplicator, createTargets: KtAnalysisSession.(DIAGNOSTIC) -> List> -): HLDiagnosticFixFactory = +): HLDiagnosticFixFactory = HLDiagnosticFixFactoryWithFixedApplicator(applicator, createTargets) /** * Returns a [HLDiagnosticFixFactory] that creates [HLQuickFix]es from a diagnostic. */ -fun , TARGET_PSI : PsiElement, INPUT : HLApplicatorInput> diagnosticFixFactory( - createQuickFixes: KtAnalysisSession.(DIAGNOSTIC) -> List> -): HLDiagnosticFixFactory = +fun > diagnosticFixFactory( + createQuickFixes: KtAnalysisSession.(DIAGNOSTIC) -> List> +): HLDiagnosticFixFactory = HLDiagnosticFixFactoryWithVariableApplicator(createQuickFixes) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/KtQuickFixesList.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/KtQuickFixesList.kt index 75a2a5aef84..54e6f0eca77 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/KtQuickFixesList.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/KtQuickFixesList.kt @@ -30,7 +30,7 @@ class KtQuickFixesList @ForKtQuickFixesListBuilder @OptIn(PrivateForInline::clas is HLQuickFixFactory.HLApplicatorBasedFactory -> { @Suppress("UNCHECKED_CAST") val factory = quickFixFactory.applicatorFactory - as HLDiagnosticFixFactory, PsiElement, HLApplicatorInput> + as HLDiagnosticFixFactory> createPlatformQuickFixes(diagnostic, factory) } is HLQuickFixFactory.HLQuickFixesPsiBasedFactory -> quickFixFactory.psiFactory.createQuickFix(diagnostic.psi) @@ -66,8 +66,8 @@ class KtQuickFixesListBuilder private constructor() { } @OptIn(PrivateForInline::class) - inline fun , TARGET_PSI : PsiElement, INPUT : HLApplicatorInput> registerApplicator( - quickFixFactory: HLDiagnosticFixFactory + inline fun > registerApplicator( + quickFixFactory: HLDiagnosticFixFactory ) { registerApplicator(DIAGNOSTIC::class, quickFixFactory) } @@ -82,9 +82,9 @@ class KtQuickFixesListBuilder private constructor() { @PrivateForInline - fun , TARGET_PSI : PsiElement, INPUT : HLApplicatorInput> registerApplicator( + fun > registerApplicator( diagnosticClass: KClass, - quickFixFactory: HLDiagnosticFixFactory + quickFixFactory: HLDiagnosticFixFactory ) { quickFixes.getOrPut(diagnosticClass) { mutableListOf() } .add(HLQuickFixFactory.HLApplicatorBasedFactory(quickFixFactory)) @@ -105,7 +105,7 @@ sealed class HLQuickFixFactory { ) : HLQuickFixFactory() class HLApplicatorBasedFactory( - val applicatorFactory: HLDiagnosticFixFactory<*, *, *, *> + val applicatorFactory: HLDiagnosticFixFactory<*, *> ) : HLQuickFixFactory() } @@ -121,4 +121,4 @@ private fun List>>.merge(): Map> { } @RequiresOptIn -annotation class ForKtQuickFixesListBuilder() +annotation class ForKtQuickFixesListBuilder diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ReplaceCallFixFactories.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ReplaceCallFixFactories.kt index 70be62a31d7..1614a0ab76f 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ReplaceCallFixFactories.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ReplaceCallFixFactories.kt @@ -40,7 +40,7 @@ object ReplaceCallFixFactories { class Input(val notNullNeeded: Boolean) : HLApplicatorInput val unsafeCallFactory = - diagnosticFixFactory { diagnostic -> + diagnosticFixFactory { diagnostic -> fun KtExpression.shouldHaveNotNullType(): Boolean { // This function is used to determine if we may need to add an elvis operator after the safe call. For example, to replace // `s.length` in `val x: Int = s.length` with a safe call, it should be replaced with `s.length ?: `.