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 ba4bbd016a7..1e3a6e45ef1 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 @@ -131,6 +131,7 @@ fun KtCallExpression.canMoveLambdaOutsideParentheses(): Boolean { val callee = calleeExpression if (callee is KtNameReferenceExpression) { + val lambdaArgumentCount = valueArguments.mapNotNull { it.getArgumentExpression()?.unpackFunctionLiteral() }.count() val bindingContext = analyze(BodyResolveMode.PARTIAL) val targets = bindingContext[BindingContext.REFERENCE_TARGET, callee]?.let { listOf(it) } ?: bindingContext[BindingContext.AMBIGUOUS_REFERENCE_TARGET, callee] @@ -138,11 +139,9 @@ fun KtCallExpression.canMoveLambdaOutsideParentheses(): Boolean { val candidates = targets.filterIsInstance() // if there are functions among candidates but none of them have last function parameter then not show the intention if (candidates.isNotEmpty() && candidates.none { - val lastParameter = it.valueParameters.lastOrNull() - lastParameter != null && lastParameter.type.isFunctionType - }) { - return false - } + val params = it.valueParameters + params.lastOrNull()?.type?.isFunctionType == true && params.count { it.type.isFunctionType } == lambdaArgumentCount + }) return false } return true diff --git a/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters.kt b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters.kt new file mode 100644 index 00000000000..637763b97f0 --- /dev/null +++ b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters.kt @@ -0,0 +1,10 @@ +// PROBLEM: none + +fun test(a: (String) -> Unit = {}, b: (String) -> Unit = {}) { + a("a") + b("b") +} + +fun foo() { + test({ }) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters2.kt b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters2.kt new file mode 100644 index 00000000000..c06a2ce245b --- /dev/null +++ b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters2.kt @@ -0,0 +1,8 @@ +fun test(a: (String) -> Unit = {}, b: (String) -> Unit = {}) { + a("a") + b("b") +} + +fun foo() { + test({ }, { }) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters2.kt.after b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters2.kt.after new file mode 100644 index 00000000000..1503aef5cf3 --- /dev/null +++ b/idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters2.kt.after @@ -0,0 +1,8 @@ +fun test(a: (String) -> Unit = {}, b: (String) -> Unit = {}) { + a("a") + b("b") +} + +fun foo() { + test({ }) { } +} \ 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 050dbba6df6..119134314fa 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -2665,6 +2665,16 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableAlreadyHasFunctionLiteral.kt"); } + @TestMetadata("inapplicableMultiFunctionTypeParameters.kt") + public void testInapplicableMultiFunctionTypeParameters() throws Exception { + runTest("idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters.kt"); + } + + @TestMetadata("inapplicableMultiFunctionTypeParameters2.kt") + public void testInapplicableMultiFunctionTypeParameters2() throws Exception { + runTest("idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableMultiFunctionTypeParameters2.kt"); + } + @TestMetadata("inapplicableOptionalParametersAfter.kt") public void testInapplicableOptionalParametersAfter() throws Exception { runTest("idea/testData/inspectionsLocal/moveLambdaOutsideParentheses/inapplicableOptionalParametersAfter.kt");