From cbaa8e5be21c6a018e1c558453c1c9e64e291d43 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 13 Nov 2018 10:45:48 +0900 Subject: [PATCH] Remove single lambda parameter declaration: fix false positive on property with implicit type #KT-23134 --- .../idea/quickfix/RemoveSingleLambdaParameterFix.kt | 11 ++++++----- .../propertyWithExplicitType.kt | 8 ++++++++ .../propertyWithExplicitType.kt.after | 8 ++++++++ .../propertyWithImplicitType.kt | 10 ++++++++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 10 ++++++++++ 5 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 idea/testData/quickfix/removeSingleLambdaParameter/propertyWithExplicitType.kt create mode 100644 idea/testData/quickfix/removeSingleLambdaParameter/propertyWithExplicitType.kt.after create mode 100644 idea/testData/quickfix/removeSingleLambdaParameter/propertyWithImplicitType.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveSingleLambdaParameterFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveSingleLambdaParameterFix.kt index 7f2cdd59426..6043d67a19a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveSingleLambdaParameterFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveSingleLambdaParameterFix.kt @@ -21,10 +21,8 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtLambdaExpression -import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.KtParameterList +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType class RemoveSingleLambdaParameterFix(element: KtParameter) : KotlinQuickFixAction(element) { override fun getFamilyName() = "Remove single lambda parameter declaration" @@ -47,7 +45,10 @@ class RemoveSingleLambdaParameterFix(element: KtParameter) : KotlinQuickFixActio if (parameterList.parameters.size != 1) return null - if (parameterList.parent.parent !is KtLambdaExpression) return null + val lambda = parameterList.parent.parent as? KtLambdaExpression ?: return null + + val property = lambda.getStrictParentOfType() + if (property != null && property.typeReference == null) return null return RemoveSingleLambdaParameterFix(parameter) } diff --git a/idea/testData/quickfix/removeSingleLambdaParameter/propertyWithExplicitType.kt b/idea/testData/quickfix/removeSingleLambdaParameter/propertyWithExplicitType.kt new file mode 100644 index 00000000000..4b6e35e7a9e --- /dev/null +++ b/idea/testData/quickfix/removeSingleLambdaParameter/propertyWithExplicitType.kt @@ -0,0 +1,8 @@ +// "Remove single lambda parameter declaration" "true" +fun test() { + val f: (Int) -> Unit = { i: Int -> foo() } + bar(f) +} + +fun foo() {} +fun bar(f: (Int) -> Unit) {} diff --git a/idea/testData/quickfix/removeSingleLambdaParameter/propertyWithExplicitType.kt.after b/idea/testData/quickfix/removeSingleLambdaParameter/propertyWithExplicitType.kt.after new file mode 100644 index 00000000000..1cbd914c06c --- /dev/null +++ b/idea/testData/quickfix/removeSingleLambdaParameter/propertyWithExplicitType.kt.after @@ -0,0 +1,8 @@ +// "Remove single lambda parameter declaration" "true" +fun test() { + val f: (Int) -> Unit = { foo() } + bar(f) +} + +fun foo() {} +fun bar(f: (Int) -> Unit) {} diff --git a/idea/testData/quickfix/removeSingleLambdaParameter/propertyWithImplicitType.kt b/idea/testData/quickfix/removeSingleLambdaParameter/propertyWithImplicitType.kt new file mode 100644 index 00000000000..0fcebe99ccf --- /dev/null +++ b/idea/testData/quickfix/removeSingleLambdaParameter/propertyWithImplicitType.kt @@ -0,0 +1,10 @@ +// "Remove single lambda parameter declaration" "false" +// ACTION: Remove explicit lambda parameter types (may break code) +// ACTION: Rename to _ +fun test() { + val f = { i: Int -> foo() } + bar(f) +} + +fun foo() {} +fun bar(f: (Int) -> Unit) {} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 9531364d793..8ab2a9cd039 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9505,6 +9505,16 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/removeSingleLambdaParameter/multiple.kt"); } + @TestMetadata("propertyWithExplicitType.kt") + public void testPropertyWithExplicitType() throws Exception { + runTest("idea/testData/quickfix/removeSingleLambdaParameter/propertyWithExplicitType.kt"); + } + + @TestMetadata("propertyWithImplicitType.kt") + public void testPropertyWithImplicitType() throws Exception { + runTest("idea/testData/quickfix/removeSingleLambdaParameter/propertyWithImplicitType.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("idea/testData/quickfix/removeSingleLambdaParameter/simple.kt");