From 7d89869c0214048566b6666e2d368e64b7acc3fa Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 21 Oct 2016 13:13:28 +0300 Subject: [PATCH] Do not suggest "Remove parameter" quick-fix on lambdas Only "Rename to _" should work in the case. The problem is that removing lambda's parameter may lead behaviour changes. This quick-fix was not being invoked run before KT-14347 had been implemented # Conflicts: # idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java --- .../quickfix/RemoveUnusedFunctionParameterFix.kt | 10 ++++++++-- ...functionExpressionParameterNoRemoveParameter.kt | 13 +++++++++++++ .../lambdaParameterNoRemoveParameter.kt | 14 ++++++++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 12 ++++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 idea/testData/quickfix/renameToUnderscore/functionExpressionParameterNoRemoveParameter.kt create mode 100644 idea/testData/quickfix/renameToUnderscore/lambdaParameterNoRemoveParameter.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt index c535f27420d..326ee29668c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt @@ -23,6 +23,8 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtFunctionLiteral +import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtParameter class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixAction(parameter) { @@ -38,8 +40,12 @@ class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixA } companion object : KotlinSingleIntentionActionFactory() { - override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction { - return RemoveUnusedFunctionParameterFix(Errors.UNUSED_PARAMETER.cast(diagnostic).psiElement) + override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { + val parameter = Errors.UNUSED_PARAMETER.cast(diagnostic).psiElement + val parameterOwner = parameter.parent.parent + if (parameterOwner is KtFunctionLiteral || + (parameterOwner is KtNamedFunction && parameterOwner.name == null)) return null + return RemoveUnusedFunctionParameterFix(parameter) } } } diff --git a/idea/testData/quickfix/renameToUnderscore/functionExpressionParameterNoRemoveParameter.kt b/idea/testData/quickfix/renameToUnderscore/functionExpressionParameterNoRemoveParameter.kt new file mode 100644 index 00000000000..1ede27f0275 --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/functionExpressionParameterNoRemoveParameter.kt @@ -0,0 +1,13 @@ +// "Remove parameter 'x'" "false" +// ACTION: Add 'block =' to argument +// ACTION: Convert parameter to receiver +// ACTION: Rename to _ +// ACTION: Specify return type explicitly + +fun foo(block: (String, Int) -> Unit) { + block("", 1) +} + +fun bar() { + foo(fun(x: String, y: Int) = Unit) +} diff --git a/idea/testData/quickfix/renameToUnderscore/lambdaParameterNoRemoveParameter.kt b/idea/testData/quickfix/renameToUnderscore/lambdaParameterNoRemoveParameter.kt new file mode 100644 index 00000000000..d61be95a8b0 --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/lambdaParameterNoRemoveParameter.kt @@ -0,0 +1,14 @@ +// "Remove parameter 'x'" "false" +// ACTION: Move lambda argument into parentheses +// ACTION: Remove explicit lambda parameter types (may break code) +// ACTION: Rename to _ + +fun foo(block: (String, Int) -> Unit) { + block("", 1) +} + +fun bar() { + foo { x: String, y: Int -> + y.hashCode() + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 9902af6f332..2171755b4b1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7439,6 +7439,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("functionExpressionParameterNoRemoveParameter.kt") + public void testFunctionExpressionParameterNoRemoveParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToUnderscore/functionExpressionParameterNoRemoveParameter.kt"); + doTest(fileName); + } + @TestMetadata("lambdaDestructuring.kt") public void testLambdaDestructuring() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToUnderscore/lambdaDestructuring.kt"); @@ -7451,6 +7457,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("lambdaParameterNoRemoveParameter.kt") + public void testLambdaParameterNoRemoveParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToUnderscore/lambdaParameterNoRemoveParameter.kt"); + doTest(fileName); + } + @TestMetadata("noActionForCommonVal.kt") public void testNoActionForCommonVal() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToUnderscore/noActionForCommonVal.kt");