From bd80926e8aabea54cd5a124b6d04945f6778b88e Mon Sep 17 00:00:00 2001 From: Frederik Haselmeier Date: Tue, 6 Aug 2024 16:30:48 +0200 Subject: [PATCH] [kotlin] ported ConvertExtensionToFunctionTypeFix to K2 ^KTIJ-29490 fixed GitOrigin-RevId: 38a2f2a95d12cf8b1d32c84b20c0f53a15d12f7a --- ...onvertExtensionToFunctionTypeFixFactory.kt | 58 +++++++++++++++++++ .../fixes/KotlinK2QuickFixRegistrar.kt | 2 + .../fixes/HighLevelQuickFixTestGenerated.java | 32 ++++++++++ .../ConvertExtensionToFunctionTypeFix.kt | 33 +++++++++++ .../ConvertExtensionToFunctionTypeFix.kt | 58 ------------------- ...onvertExtensionToFunctionTypeFixFactory.kt | 37 ++++++++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 +- .../quickfix/K1QuickFixTestGenerated.java | 5 ++ .../typeWith1Argument.kt | 3 +- .../typeWith1Argument.kt.after | 3 +- .../typeWithAnnotations.kt | 14 +++++ .../typeWithAnnotations.kt.after | 14 +++++ .../typeWithNoArgument.kt | 3 +- .../typeWithNoArgument.kt.after | 3 +- .../typeWithTypeArgument.kt | 3 +- .../typeWithTypeArgument.kt.after | 3 +- .../codeinsight/GenerateK2QuickFixTests.kt | 2 +- 17 files changed, 209 insertions(+), 66 deletions(-) create mode 100644 plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ConvertExtensionToFunctionTypeFixFactory.kt create mode 100644 plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFix.kt delete mode 100644 plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFix.kt create mode 100644 plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFixFactory.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt.after diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ConvertExtensionToFunctionTypeFixFactory.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ConvertExtensionToFunctionTypeFixFactory.kt new file mode 100644 index 000000000000..cf053bfe8a71 --- /dev/null +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ConvertExtensionToFunctionTypeFixFactory.kt @@ -0,0 +1,58 @@ +// 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.util.containers.addIfNotNull +import org.jetbrains.kotlin.analysis.api.KaExperimentalApi +import org.jetbrains.kotlin.analysis.api.KaSession +import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic +import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KaAnnotationRendererForSource +import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KaRendererAnnotationsFilter +import org.jetbrains.kotlin.analysis.api.renderer.types.KaTypeRenderer +import org.jetbrains.kotlin.analysis.api.renderer.types.impl.KaTypeRendererForSource +import org.jetbrains.kotlin.analysis.api.types.KaFunctionType +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixFactory +import org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix +import org.jetbrains.kotlin.psi.KtTypeReference +import org.jetbrains.kotlin.types.Variance + +internal object ConvertExtensionToFunctionTypeFixFactory { + /** + * Renders the [functionType] but moves a potential receiver type to be a parameter instead. + */ + @OptIn(KaExperimentalApi::class) + private fun KaSession.renderFunctionTypeWithoutReceiver(functionType: KaFunctionType, renderer: KaTypeRenderer): String { + val renderedParametersList = buildList { + addIfNotNull(functionType.receiverType) + addAll(functionType.parameterTypes) + }.joinToString(", ", "(", ")") { + it.render(renderer, Variance.INVARIANT) + } + val renderedReturnType = functionType.returnType.render(renderer, Variance.INVARIANT) + return "$renderedParametersList -> $renderedReturnType" + } + + @OptIn(KaExperimentalApi::class) + private val shortNameRenderer = KaTypeRendererForSource.WITH_SHORT_NAMES.with { + annotationsRenderer = KaAnnotationRendererForSource.WITH_SHORT_NAMES.with { + annotationFilter = KaRendererAnnotationsFilter.NONE + } + } + + @OptIn(KaExperimentalApi::class) + private fun KaSession.createQuickFix(typeReference: KtTypeReference): ConvertExtensionToFunctionTypeFix? { + val type = typeReference.type as? KaFunctionType ?: return null + if (!type.hasReceiver) return null + // We do not support rendering context receivers + if (type.contextReceivers.isNotEmpty()) return null + + val shortName = renderFunctionTypeWithoutReceiver(type, shortNameRenderer) + val longName = renderFunctionTypeWithoutReceiver(type, KaTypeRendererForSource.WITH_QUALIFIED_NAMES) + return ConvertExtensionToFunctionTypeFix(typeReference, shortName, longName) + } + + val superTypeIsExtensionFunctionType = + KotlinQuickFixFactory.ModCommandBased { diagnostic: KaFirDiagnostic.SupertypeIsExtensionFunctionType -> + val typeReference = diagnostic.psi as? KtTypeReference ?: return@ModCommandBased emptyList() + listOfNotNull(createQuickFix(typeReference)) + } +} \ No newline at end of file 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 968d0f92542d..816ba4698a07 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 @@ -442,6 +442,8 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(ChangeMemberFunctionSignatureFixFactory.nothingToOverrideFixFactory) registerFactory(ReplaceJvmFieldWithConstFixFactory.inapplicableJvmField) + + registerFactory(ConvertExtensionToFunctionTypeFixFactory.superTypeIsExtensionFunctionType) } private val optIn = 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 bccb2421384a..2f1482effb2c 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 @@ -10216,7 +10216,39 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/quickfix/superTypeIsExtensionType") + public static class SuperTypeIsExtensionType 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("typeWith1Argument.kt") + public void testTypeWith1Argument() throws Exception { + runTest("../../../idea/tests/testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt"); + } + + @TestMetadata("typeWithAnnotations.kt") + public void testTypeWithAnnotations() throws Exception { + runTest("../../../idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt"); + } + + @TestMetadata("typeWithNoArgument.kt") + public void testTypeWithNoArgument() throws Exception { + runTest("../../../idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt"); + } + + @TestMetadata("typeWithTypeArgument.kt") + public void testTypeWithTypeArgument() throws Exception { + runTest("../../../idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithTypeArgument.kt"); + } + } @RunWith(JUnit3RunnerWithInners.class) @TestMetadata("../../../idea/tests/testData/quickfix/surroundWithNullCheck") diff --git a/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFix.kt b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFix.kt new file mode 100644 index 000000000000..c347a9a8eaeb --- /dev/null +++ b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFix.kt @@ -0,0 +1,33 @@ +// 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.quickfix + +import com.intellij.modcommand.ActionContext +import com.intellij.modcommand.ModPsiUpdater +import com.intellij.modcommand.Presentation +import com.intellij.modcommand.PsiUpdateModCommandAction +import org.jetbrains.kotlin.idea.base.codeInsight.ShortenReferencesFacility +import org.jetbrains.kotlin.idea.base.psi.replaced +import org.jetbrains.kotlin.idea.base.resources.KotlinBundle +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.KtTypeReference + +class ConvertExtensionToFunctionTypeFix( + element: KtTypeReference, + private val targetTypeStringShort: String, + private val targetTypeStringLong: String +) : PsiUpdateModCommandAction(element) { + override fun getPresentation(context: ActionContext, element: KtTypeReference): Presentation? { + return Presentation.of(KotlinBundle.message("convert.supertype.to.0", targetTypeStringShort)) + } + + override fun getFamilyName(): String = KotlinBundle.message("convert.extension.function.type.to.regular.function.type") + + override fun invoke( + context: ActionContext, + element: KtTypeReference, + updater: ModPsiUpdater + ) { + val replaced = element.replaced(KtPsiFactory(context.project).createType(targetTypeStringLong)) + ShortenReferencesFacility.getInstance().shorten(replaced) + } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFix.kt deleted file mode 100644 index 94b859773296..000000000000 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFix.kt +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - -package org.jetbrains.kotlin.idea.quickfix - -import com.intellij.codeInsight.intention.IntentionAction -import com.intellij.openapi.editor.Editor -import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType -import org.jetbrains.kotlin.builtins.isExtensionFunctionType -import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.diagnostics.Errors -import org.jetbrains.kotlin.idea.base.resources.KotlinBundle -import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.core.ShortenReferences -import org.jetbrains.kotlin.idea.base.psi.replaced -import org.jetbrains.kotlin.idea.codeinsight.api.classic.quickfixes.KotlinQuickFixAction -import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtPsiFactory -import org.jetbrains.kotlin.psi.KtTypeReference -import org.jetbrains.kotlin.renderer.DescriptorRenderer -import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.types.KotlinType - -class ConvertExtensionToFunctionTypeFix(element: KtTypeReference, type: KotlinType) : KotlinQuickFixAction(element) { - - private val targetTypeStringShort = type.renderType(IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_NO_ANNOTATIONS) - private val targetTypeStringLong = type.renderType(IdeDescriptorRenderers.SOURCE_CODE) - - override fun getText() = KotlinBundle.message("convert.supertype.to.0", targetTypeStringShort) - override fun getFamilyName() = KotlinBundle.message("convert.extension.function.type.to.regular.function.type") - - override fun invoke(project: Project, editor: Editor?, file: KtFile) { - val element = element ?: return - val replaced = element.replaced(KtPsiFactory(project).createType(targetTypeStringLong)) - ShortenReferences.DEFAULT.process(replaced) - } - - private fun KotlinType.renderType(renderer: DescriptorRenderer) = buildString { - append('(') - arguments.dropLast(1).joinTo(this@buildString, ", ") { renderer.renderType(it.type) } - append(") -> ") - append(renderer.renderType(this@renderType.getReturnTypeFromFunctionType())) - } - - companion object Factory : KotlinIntentionActionsFactory() { - override fun doCreateActions(diagnostic: Diagnostic): List { - val casted = Errors.SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE.cast(diagnostic) - val element = casted.psiElement - - val type = element.analyze(BodyResolveMode.PARTIAL).get(BindingContext.TYPE, element) ?: return emptyList() - if (!type.isExtensionFunctionType) return emptyList() - - return listOf(ConvertExtensionToFunctionTypeFix(element, type)) - } - } -} diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFixFactory.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFixFactory.kt new file mode 100644 index 000000000000..564b55419d59 --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertExtensionToFunctionTypeFixFactory.kt @@ -0,0 +1,37 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + +package org.jetbrains.kotlin.idea.quickfix + +import com.intellij.codeInsight.intention.IntentionAction +import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType +import org.jetbrains.kotlin.builtins.isExtensionFunctionType +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers +import org.jetbrains.kotlin.renderer.DescriptorRenderer +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode +import org.jetbrains.kotlin.types.KotlinType + +object ConvertExtensionToFunctionTypeFixFactory : KotlinIntentionActionsFactory() { + private fun KotlinType.renderType(renderer: DescriptorRenderer) = buildString { + append('(') + arguments.dropLast(1).joinTo(this@buildString, ", ") { renderer.renderType(it.type) } + append(") -> ") + append(renderer.renderType(this@renderType.getReturnTypeFromFunctionType())) + } + + override fun doCreateActions(diagnostic: Diagnostic): List { + + val casted = Errors.SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE.cast(diagnostic) + val element = casted.psiElement + + val type = element.analyze(BodyResolveMode.PARTIAL).get(BindingContext.TYPE, element) ?: return emptyList() + if (!type.isExtensionFunctionType) return emptyList() + val targetTypeStringShort = type.renderType(IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_NO_ANNOTATIONS) + val targetTypeStringLong = type.renderType(IdeDescriptorRenderers.SOURCE_CODE) + + return listOf(ConvertExtensionToFunctionTypeFix(element, targetTypeStringShort, targetTypeStringLong).asIntention()) + } +} diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index f85637a98cfe..e123398957e4 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -577,7 +577,7 @@ class QuickFixRegistrar : QuickFixContributor { UNRESOLVED_REFERENCE.registerFactory(MakeConstructorParameterPropertyFix) DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE.registerFactory(SpecifyOverrideExplicitlyFix) - SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE.registerFactory(ConvertExtensionToFunctionTypeFix) + SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE.registerFactory(ConvertExtensionToFunctionTypeFixFactory) UNUSED_LAMBDA_EXPRESSION.registerFactory(AddRunToLambdaFix) diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java index dcf881e41e8d..feb044b01617 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java @@ -15834,6 +15834,11 @@ public abstract class K1QuickFixTestGenerated extends AbstractK1QuickFixTest { runTest("testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt"); } + @TestMetadata("typeWithAnnotations.kt") + public void testTypeWithAnnotations() throws Exception { + runTest("testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt"); + } + @TestMetadata("typeWithNoArgument.kt") public void testTypeWithNoArgument() throws Exception { runTest("testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt"); diff --git a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt index 44b0630a2682..3894357eea08 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt @@ -4,4 +4,5 @@ class Foo : String.(String) -> Unit { override fun invoke(p1: String, p2: String) { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt.after index 3955eb5f2106..1def54a918b5 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWith1Argument.kt.after @@ -4,4 +4,5 @@ class Foo : (String, String) -> Unit { override fun invoke(p1: String, p2: String) { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt new file mode 100644 index 000000000000..2d113472b79d --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt @@ -0,0 +1,14 @@ +// "Convert supertype to '(String, T) -> Unit'" "true" +@Target(AnnotationTarget.TYPE) +annotation class TestA +@Target(AnnotationTarget.TYPE) +annotation class TestB +@Target(AnnotationTarget.TYPE) +annotation class TestC + +class Foo : (@TestA String).(@TestB T) -> @TestC Unit { + override fun invoke(p1: String, p2: T) { + } +} +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt.after new file mode 100644 index 000000000000..fce4053bd54d --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithAnnotations.kt.after @@ -0,0 +1,14 @@ +// "Convert supertype to '(String, T) -> Unit'" "true" +@Target(AnnotationTarget.TYPE) +annotation class TestA +@Target(AnnotationTarget.TYPE) +annotation class TestB +@Target(AnnotationTarget.TYPE) +annotation class TestC + +class Foo : (@TestA String, @TestB T) -> @TestC Unit { + override fun invoke(p1: String, p2: T) { + } +} +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt index 230c1f72b262..474b9a807efa 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt @@ -4,4 +4,5 @@ class Foo : String.() -> Unit { override fun invoke(p1: String) { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt.after index 76ce17113ffe..6b5ddf39f4c4 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithNoArgument.kt.after @@ -4,4 +4,5 @@ class Foo : (String) -> Unit { override fun invoke(p1: String) { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithTypeArgument.kt b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithTypeArgument.kt index 1c527b64e24b..cdfef45a117d 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithTypeArgument.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithTypeArgument.kt @@ -4,4 +4,5 @@ class Foo : String.(T) -> Unit { override fun invoke(p1: String, p2: T) { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithTypeArgument.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithTypeArgument.kt.after index 76e13be20a89..a724aee92dfc 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithTypeArgument.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/superTypeIsExtensionType/typeWithTypeArgument.kt.after @@ -4,4 +4,5 @@ class Foo : (String, T) -> Unit { override fun invoke(p1: String, p2: T) { } } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertExtensionToFunctionTypeFix \ 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 2119d6c38abc..fed016f8fa5f 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 @@ -186,7 +186,7 @@ internal fun MutableTWorkspace.generateK2FixTests() { model("$idea/quickfix/specifyOverrideExplicitly", pattern = pattern) model("$idea/quickfix/specifySuperExplicitly", pattern = pattern, isIgnored = true) model("$idea/quickfix/specifyTypeExplicitly", pattern = pattern, isIgnored = true) - model("$idea/quickfix/superTypeIsExtensionType", pattern = pattern, isIgnored = true) + model("$idea/quickfix/superTypeIsExtensionType", pattern = pattern) model("$idea/quickfix/surroundWithNullCheck", pattern = pattern) model("$idea/quickfix/suspiciousCollectionReassignment", pattern = pattern, isIgnored = true) model("$idea/quickfix/tooLongCharLiteralToString", pattern = pattern)