From 8e61a138099eacb1b39c802f1d3334ca9caf8651 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Mon, 18 Feb 2019 10:52:03 +0900 Subject: [PATCH] Move lambda argument out of parentheses: fix false negative when function type is type parameter #KT-26979 Fixed --- .../org/jetbrains/kotlin/idea/core/psiModificationUtils.kt | 7 +++++-- .../moveLambdaOutsideParentheses/typeParameter.kt | 5 +++++ .../moveLambdaOutsideParentheses/typeParameter.kt.after | 5 +++++ .../idea/inspections/LocalInspectionTestGenerated.java | 5 +++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/typeParameter.kt create mode 100644 idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/typeParameter.kt.after diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt index b49064e6d4e..560bc8d9ab5 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt @@ -45,6 +45,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.isError +import org.jetbrains.kotlin.types.typeUtil.isTypeParameter import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments import org.jetbrains.kotlin.utils.SmartList @@ -138,8 +139,10 @@ fun KtCallExpression.canMoveLambdaOutsideParentheses(): Boolean { // if there are functions among candidates but none of them have last function parameter then not show the intention if (candidates.isNotEmpty() && candidates.none { candidate -> val params = candidate.valueParameters - params.lastOrNull()?.type?.isFunctionOrSuspendFunctionType == true && - params.count { it.type.isFunctionOrSuspendFunctionType } == lambdaArgumentCount + referenceArgumentCount + val lastParamType = params.lastOrNull()?.type + (lastParamType?.isFunctionOrSuspendFunctionType == true || lastParamType?.isTypeParameter() == true) && params.count { + it.type.let { type -> type.isFunctionOrSuspendFunctionType || type.isTypeParameter() } + } == lambdaArgumentCount + referenceArgumentCount } ) return false } diff --git a/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/typeParameter.kt b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/typeParameter.kt new file mode 100644 index 00000000000..bf8be73267b --- /dev/null +++ b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/typeParameter.kt @@ -0,0 +1,5 @@ +fun foo(t: T) {} + +fun test() { + foo({ "a" }) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/typeParameter.kt.after b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/typeParameter.kt.after new file mode 100644 index 00000000000..ac5beae3f47 --- /dev/null +++ b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/typeParameter.kt.after @@ -0,0 +1,5 @@ +fun foo(t: T) {} + +fun test() { + foo { "a" } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index b107a111639..b73f14c3024 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -4167,6 +4167,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { public void testSuspendLambda() throws Exception { runTest("idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/suspendLambda.kt"); } + + @TestMetadata("typeParameter.kt") + public void testTypeParameter() throws Exception { + runTest("idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/typeParameter.kt"); + } } @TestMetadata("idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses")