From 48117cfbb561af849bff9a24e842e6fd6831984a Mon Sep 17 00:00:00 2001 From: Andrey Cherkasov Date: Mon, 9 Sep 2024 17:14:41 +0400 Subject: [PATCH] [kotlin] Port `InlineTypeParameterFix` to K2 This quick is for the FINAL_UPPER_BOUND compiler warning. ^KTIJ-29501 GitOrigin-RevId: 8f8f66b1af5e60208a0ecf6e155466db76628ce9 --- .../fixes/FinalUpperBoundFixFactories.kt | 37 +++++++++++++++++++ .../fixes/KotlinK2QuickFixRegistrar.kt | 1 + .../fixes/HighLevelQuickFixTestGenerated.java | 37 +++++++++++++++++++ .../quickfix/inlineTypeParameterFix/basic.kt | 3 +- .../inlineTypeParameterFix/basic.kt.after | 3 +- .../basicMultipleDef.kt | 3 +- .../basicMultipleDef.kt.after | 3 +- .../inlineTypeParameterFix/function.kt | 3 +- .../inlineTypeParameterFix/function.kt.after | 3 +- .../inlineTypeParameterFix/typeConstraint.kt | 3 +- .../typeConstraint.kt.after | 3 +- .../typeConstraintMultipleDef.kt | 3 +- .../typeConstraintMultipleDef.kt.after | 3 +- .../codeinsight/GenerateK2QuickFixTests.kt | 2 +- 14 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/FinalUpperBoundFixFactories.kt diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/FinalUpperBoundFixFactories.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/FinalUpperBoundFixFactories.kt new file mode 100644 index 000000000000..46737d9656a0 --- /dev/null +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/FinalUpperBoundFixFactories.kt @@ -0,0 +1,37 @@ +// 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 com.intellij.psi.createSmartPointer +import com.intellij.psi.util.descendantsOfType +import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic +import org.jetbrains.kotlin.analysis.api.types.KaTypeParameterType +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixFactory +import org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +import org.jetbrains.kotlin.idea.quickfix.prepareInlinedTypeParameterContext +import org.jetbrains.kotlin.psi.KtTypeParameterListOwner +import org.jetbrains.kotlin.psi.KtTypeReference +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType + +internal object FinalUpperBoundFixFactories { + + val inlineTypeParameterFixFactory = KotlinQuickFixFactory.ModCommandBased { diagnostic: KaFirDiagnostic.FinalUpperBound -> + val element = diagnostic.psi as? KtTypeReference ?: return@ModCommandBased emptyList() + val parameterListOwner = element.getStrictParentOfType() ?: return@ModCommandBased emptyList() + val parameterList = parameterListOwner.typeParameterList ?: return@ModCommandBased emptyList() + val (parameter, _, _) = prepareInlinedTypeParameterContext(element, parameterList) ?: return@ModCommandBased emptyList() + val parameterSymbol = parameter.symbol + + val typeReferencesToInline = parameterListOwner + .descendantsOfType() + .filter { typeReference -> + val typeElement = typeReference.typeElement + val type = typeReference.type as? KaTypeParameterType + typeElement != null && type?.symbol == parameterSymbol + }.map { it.createSmartPointer() } + .toList() + + listOf( + InlineTypeParameterFix(element, typeReferencesToInline) + ) + } +} 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 255e3d35b3e5..518b59aa5624 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 @@ -174,6 +174,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(WrapWithParenthesesFixFactories.suspendFunErrorFixFactory) registerFactory(DeclarationCantBeInlinedFixFactories.removeOpenModifierFixFactory) registerFactory(WrongAnnotationTargetFixFactories.addAnnotationUseSiteTargetFixFactory) + registerFactory(FinalUpperBoundFixFactories.inlineTypeParameterFixFactory) } private val addAbstract = KtQuickFixesListBuilder.registerPsiQuickFix { 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 e0c37ae929f0..fbf71dff5569 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 @@ -9594,7 +9594,44 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu } } + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/quickfix/inlineTypeParameterFix") + public static class InlineTypeParameterFix 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("basic.kt") + public void testBasic() throws Exception { + runTest("../../../idea/tests/testData/quickfix/inlineTypeParameterFix/basic.kt"); + } + + @TestMetadata("basicMultipleDef.kt") + public void testBasicMultipleDef() throws Exception { + runTest("../../../idea/tests/testData/quickfix/inlineTypeParameterFix/basicMultipleDef.kt"); + } + + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("../../../idea/tests/testData/quickfix/inlineTypeParameterFix/function.kt"); + } + + @TestMetadata("typeConstraint.kt") + public void testTypeConstraint() throws Exception { + runTest("../../../idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraint.kt"); + } + + @TestMetadata("typeConstraintMultipleDef.kt") + public void testTypeConstraintMultipleDef() throws Exception { + runTest("../../../idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraintMultipleDef.kt"); + } + } @RunWith(JUnit3RunnerWithInners.class) @TestMetadata("../../../idea/tests/testData/quickfix/insertDelegationCall") diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basic.kt b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basic.kt index 34fefdb3e502..c96be024e101 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basic.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basic.kt @@ -1,4 +1,5 @@ // "Inline type parameter" "true" data class DC>(val x: T, val y: String) -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basic.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basic.kt.after index ac8037eb14f0..d186616f58e6 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basic.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basic.kt.after @@ -1,4 +1,5 @@ // "Inline type parameter" "true" data class DC(val x: Int, val y: String) -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basicMultipleDef.kt b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basicMultipleDef.kt index 2c633149c513..0015b24761ab 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basicMultipleDef.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basicMultipleDef.kt @@ -7,4 +7,5 @@ data class DC, S : String>(val x: T, val y: String) { val c: T = Int.MIN_VALUE } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basicMultipleDef.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basicMultipleDef.kt.after index 518d66325c00..1700245cc3d4 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basicMultipleDef.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/basicMultipleDef.kt.after @@ -7,4 +7,5 @@ data class DC(val x: Int, val y: String) { val c: Int = Int.MIN_VALUE } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/function.kt b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/function.kt index 4811a77f2401..4dae57831adb 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/function.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/function.kt @@ -5,4 +5,5 @@ data class DC(val x: Int, val y: String) { val a: S = Int.MAX_VALUE } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/function.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/function.kt.after index 4f64d5c6aa23..559694658434 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/function.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/function.kt.after @@ -5,4 +5,5 @@ data class DC(val x: Int, val y: String) { val a: Int = Int.MAX_VALUE } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraint.kt b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraint.kt index 047612ad3e04..d89a9a470d54 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraint.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraint.kt @@ -1,3 +1,4 @@ // "Inline type parameter" "true" fun test(p: T, q: T) where T : String = p.length + q.length -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraint.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraint.kt.after index 164a8896d7ce..2e410e84123a 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraint.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraint.kt.after @@ -1,3 +1,4 @@ // "Inline type parameter" "true" fun test(p: String, q: String) = p.length + q.length -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraintMultipleDef.kt b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraintMultipleDef.kt index 2cbe7852e698..9cd319edbeab 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraintMultipleDef.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraintMultipleDef.kt @@ -1,4 +1,5 @@ // "Inline type parameter" "true" open class MyClass { val length = 0 } fun test(p: T, q: U) where T : MyClass, U: Int = p.length + q -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraintMultipleDef.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraintMultipleDef.kt.after index bb4928c388e6..352e70133876 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraintMultipleDef.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/inlineTypeParameterFix/typeConstraintMultipleDef.kt.after @@ -1,4 +1,5 @@ // "Inline type parameter" "true" open class MyClass { val length = 0 } fun test(p: T, q: Int) where T : MyClass = p.length + q -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.InlineTypeParameterFix \ 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 5750838034d2..7c7c4168ab1e 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 @@ -126,7 +126,7 @@ internal fun MutableTWorkspace.generateK2FixTests() { model("$idea/quickfix/increaseVisibility", pattern = pattern) model("$idea/quickfix/initializeWithConstructorParameter", pattern = pattern) model("$idea/quickfix/inlineClass", pattern = pattern) - model("$idea/quickfix/inlineTypeParameterFix", pattern = pattern, isIgnored = true) + model("$idea/quickfix/inlineTypeParameterFix", pattern = pattern) model("$idea/quickfix/insertDelegationCall", pattern = pattern) model("$idea/quickfix/isEnumEntry", pattern = pattern) model("$idea/quickfix/javaClassOnCompanion", pattern = pattern, isIgnored = true)