From 3a83ced677c04760054a7a920f714c2b02a83113 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Mon, 30 Jun 2025 17:27:00 +0300 Subject: [PATCH] [kotlin] K2: provide 'remove parameter name' quick fix for named lambda context params KTIJ-34130 GitOrigin-RevId: efb62df7e085b505f6e0a1a491d199ee8bb3ba6c --- .../messages/KotlinBundle.properties | 1 + .../fixes/KotlinK2QuickFixRegistrar.kt | 1 + ...ontextParameterInFunctionTypeFixFactory.kt | 15 +++++++ .../fixes/HighLevelQuickFixTestGenerated.java | 39 +++++++++++++++++++ .../idea/quickfix/RemoveParameterNameFix.kt | 20 ++++++++++ .../noNameAlready.kt | 5 +++ .../notLambdaContext.kt | 6 +++ .../namedLambdaContextParameter/oneContext.kt | 7 ++++ .../oneContext.kt.after | 7 ++++ .../twoContexts.kt | 7 ++++ .../twoContexts.kt.after | 7 ++++ .../withComments.kt | 7 ++++ .../withComments.kt.after | 7 ++++ .../fe10/testGenerator/Fe10GenerateTests.kt | 1 + .../codeinsight/GenerateK2QuickFixTests.kt | 1 + 15 files changed, 131 insertions(+) create mode 100644 plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/NamedContextParameterInFunctionTypeFixFactory.kt create mode 100644 plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/RemoveParameterNameFix.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/noNameAlready.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/notLambdaContext.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/oneContext.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/oneContext.kt.after create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/twoContexts.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/twoContexts.kt.after create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/withComments.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/withComments.kt.after diff --git a/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties b/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties index 6e713814aebf..1e673fb07f9b 100644 --- a/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties +++ b/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties @@ -1223,6 +1223,7 @@ remove.modifier.fix.family=Make not {0} remove.0.modifier=Remove ''{0}'' modifier remove.modifier=Remove modifier remove.identifier.from.anonymous.function=Remove identifier from anonymous function +remove.parameter.name=Remove parameter name remove.constructor.call=Remove constructor call make.not.nullable=Make not-nullable remove.useless=Remove useless '?' 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 63b7a194c960..214a64ebb516 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 @@ -564,6 +564,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(ConvertExtensionToFunctionTypeFixFactory.superTypeIsExtensionFunctionType) registerFactory(RenameUnderscoreFixFactory.renameUnderscore) + registerFactory(NamedContextParameterInFunctionTypeFixFactory.removeParameterName) } private val optIn = KtQuickFixesListBuilder.registerPsiQuickFix { diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/NamedContextParameterInFunctionTypeFixFactory.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/NamedContextParameterInFunctionTypeFixFactory.kt new file mode 100644 index 000000000000..874ce20c3a8d --- /dev/null +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/NamedContextParameterInFunctionTypeFixFactory.kt @@ -0,0 +1,15 @@ +// Copyright 2000-2025 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 org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixFactory +import org.jetbrains.kotlin.idea.quickfix.RemoveParameterNameFix +import org.jetbrains.kotlin.psi.KtParameter + +internal object NamedContextParameterInFunctionTypeFixFactory { + val removeParameterName = KotlinQuickFixFactory.ModCommandBased { diagnostic: KaFirDiagnostic.NamedContextParameterInFunctionType -> + val contextParameter = diagnostic.psi as? KtParameter ?: return@ModCommandBased emptyList() + listOf(RemoveParameterNameFix(contextParameter)) + } +} 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 2a51bc08782d..ad121a753475 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 @@ -13878,6 +13878,45 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu } } + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/quickfix/namedLambdaContextParameter") + public static class NamedLambdaContextParameter 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("noNameAlready.kt") + public void testNoNameAlready() throws Exception { + runTest("../../../idea/tests/testData/quickfix/namedLambdaContextParameter/noNameAlready.kt"); + } + + @TestMetadata("notLambdaContext.kt") + public void testNotLambdaContext() throws Exception { + runTest("../../../idea/tests/testData/quickfix/namedLambdaContextParameter/notLambdaContext.kt"); + } + + @TestMetadata("oneContext.kt") + public void testOneContext() throws Exception { + runTest("../../../idea/tests/testData/quickfix/namedLambdaContextParameter/oneContext.kt"); + } + + @TestMetadata("twoContexts.kt") + public void testTwoContexts() throws Exception { + runTest("../../../idea/tests/testData/quickfix/namedLambdaContextParameter/twoContexts.kt"); + } + + @TestMetadata("withComments.kt") + public void testWithComments() throws Exception { + runTest("../../../idea/tests/testData/quickfix/namedLambdaContextParameter/withComments.kt"); + } + } + diff --git a/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/RemoveParameterNameFix.kt b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/RemoveParameterNameFix.kt new file mode 100644 index 000000000000..3af7dc8d4d5e --- /dev/null +++ b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/RemoveParameterNameFix.kt @@ -0,0 +1,20 @@ +// Copyright 2000-2025 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.codeInspection.util.IntentionFamilyName +import com.intellij.modcommand.ActionContext +import com.intellij.modcommand.ModPsiUpdater +import com.intellij.modcommand.PsiUpdateModCommandAction +import org.jetbrains.kotlin.idea.base.resources.KotlinBundle +import org.jetbrains.kotlin.psi.KtParameter + +class RemoveParameterNameFix(element: KtParameter) : PsiUpdateModCommandAction(element) { + override fun getFamilyName(): @IntentionFamilyName String = KotlinBundle.message("remove.parameter.name") + + override fun invoke(context: ActionContext, element: KtParameter, updater: ModPsiUpdater) { + element.nameIdentifier?.delete() + element.colon?.delete() + } + +} diff --git a/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/noNameAlready.kt b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/noNameAlready.kt new file mode 100644 index 000000000000..b99894557858 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/noNameAlready.kt @@ -0,0 +1,5 @@ +// "Remove parameter name" "false" +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun foo(bar: context(String)() -> Unit) { +} diff --git a/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/notLambdaContext.kt b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/notLambdaContext.kt new file mode 100644 index 000000000000..3b650e7b1367 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/notLambdaContext.kt @@ -0,0 +1,6 @@ +// "Remove parameter name" "false" +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(c: String) +fun foo(bar: () -> Unit) { +} diff --git a/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/oneContext.kt b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/oneContext.kt new file mode 100644 index 000000000000..007ed0e44ec8 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/oneContext.kt @@ -0,0 +1,7 @@ +// "Remove parameter name" "true" +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun foo(bar: context(c: String)() -> Unit) { +} + +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.RemoveParameterNameFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/oneContext.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/oneContext.kt.after new file mode 100644 index 000000000000..99ceb4ec5a59 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/oneContext.kt.after @@ -0,0 +1,7 @@ +// "Remove parameter name" "true" +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun foo(bar: context(String)() -> Unit) { +} + +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.RemoveParameterNameFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/twoContexts.kt b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/twoContexts.kt new file mode 100644 index 000000000000..a47b4f4287bd --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/twoContexts.kt @@ -0,0 +1,7 @@ +// "Remove parameter name" "true" +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun foo(bar: context(Int, c2: String)() -> Unit) { +} + +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.RemoveParameterNameFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/twoContexts.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/twoContexts.kt.after new file mode 100644 index 000000000000..7a5e580081ae --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/twoContexts.kt.after @@ -0,0 +1,7 @@ +// "Remove parameter name" "true" +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun foo(bar: context(Int, String)() -> Unit) { +} + +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.RemoveParameterNameFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/withComments.kt b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/withComments.kt new file mode 100644 index 000000000000..9de0378b344f --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/withComments.kt @@ -0,0 +1,7 @@ +// "Remove parameter name" "true" +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun foo(bar: context(/*1*/c/*2*/:/*3*/ String/*4*/)() -> Unit) { +} + +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.RemoveParameterNameFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/withComments.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/withComments.kt.after new file mode 100644 index 000000000000..3b41d140455e --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/namedLambdaContextParameter/withComments.kt.after @@ -0,0 +1,7 @@ +// "Remove parameter name" "true" +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun foo(bar: context(/*1*//*2*//*3*/ String/*4*/)() -> Unit) { +} + +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.RemoveParameterNameFix \ No newline at end of file diff --git a/plugins/kotlin/util/test-generator-fe10/test/org/jetbrains/kotlin/fe10/testGenerator/Fe10GenerateTests.kt b/plugins/kotlin/util/test-generator-fe10/test/org/jetbrains/kotlin/fe10/testGenerator/Fe10GenerateTests.kt index 3cd6dc709023..f05d3c8a18f1 100644 --- a/plugins/kotlin/util/test-generator-fe10/test/org/jetbrains/kotlin/fe10/testGenerator/Fe10GenerateTests.kt +++ b/plugins/kotlin/util/test-generator-fe10/test/org/jetbrains/kotlin/fe10/testGenerator/Fe10GenerateTests.kt @@ -453,6 +453,7 @@ private fun assembleWorkspace(): TWorkspace = workspace(KotlinPluginMode.K1) { "redundantInterpolationPrefix", // K2-only multi-dollar interpolation "addInterpolationPrefixUnresolvedReference", // K2-only multi-dollar interpolation "unsupportedFeature", // K2-related features only + "namedLambdaContextParameter", ) ) } 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 7b7d79bb6b9c..ee518f2f4621 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 @@ -140,6 +140,7 @@ internal fun MutableTWorkspace.generateK2FixTests() { model("$idea/quickfix/moveToConstructorParameters", pattern = pattern) model("$idea/quickfix/moveToSealedParent", pattern = pattern, isIgnored = true) model("$idea/quickfix/moveTypeAliasToTopLevel", pattern = pattern) + model("$idea/quickfix/namedLambdaContextParameter", pattern = pattern) model("$idea/quickfix/obsoleteKotlinJsPackages", pattern = pattern, isIgnored = true) model("$idea/quickfix/optimizeImports", pattern = pattern, isIgnored = true) model("$idea/quickfix/platformClasses", pattern = pattern, isIgnored = true)