From 82d81d5223a3617a49db4eccf18075c0b76423eb Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 27 Feb 2019 00:08:23 +0900 Subject: [PATCH] Change Signature: move lambda outside of parentheses if the arguments are reordered so that the lambda goes last #KT-30128 Fixed --- .../changeSignature/KotlinChangeSignatureProcessor.kt | 9 +++++++++ .../changeSignature/MoveLambdaParameterToLastAfter.kt | 6 ++++++ .../changeSignature/MoveLambdaParameterToLastBefore.kt | 6 ++++++ .../changeSignature/KotlinChangeSignatureTest.kt | 2 ++ 4 files changed, 23 insertions(+) create mode 100644 idea/testData/refactoring/changeSignature/MoveLambdaParameterToLastAfter.kt create mode 100644 idea/testData/refactoring/changeSignature/MoveLambdaParameterToLastBefore.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureProcessor.kt index a833d3c7d31..67ef5fe2d67 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureProcessor.kt @@ -31,11 +31,14 @@ import com.intellij.usageView.UsageViewDescriptor import com.intellij.util.containers.MultiMap import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedRefactoringRequests +import org.jetbrains.kotlin.idea.core.canMoveLambdaOutsideParentheses +import org.jetbrains.kotlin.idea.core.moveFunctionLiteralOutsideParentheses import org.jetbrains.kotlin.idea.refactoring.broadcastRefactoringExit import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinFunctionCallUsage import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinImplicitReceiverUsage import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinUsageInfo import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinWrapperForJavaUsageInfos +import org.jetbrains.kotlin.psi.KtCallExpression import java.util.* class KotlinChangeSignatureProcessor( @@ -136,6 +139,12 @@ class KotlinChangeSignatureProcessor( override fun performRefactoring(usages: Array) { try { super.performRefactoring(usages) + usages.forEach { + val callExpression = it.element as? KtCallExpression ?: return@forEach + if (callExpression.canMoveLambdaOutsideParentheses()) { + callExpression.moveFunctionLiteralOutsideParentheses() + } + } performDelayedRefactoringRequests(myProject) } finally { changeInfo.invalidate() diff --git a/idea/testData/refactoring/changeSignature/MoveLambdaParameterToLastAfter.kt b/idea/testData/refactoring/changeSignature/MoveLambdaParameterToLastAfter.kt new file mode 100644 index 00000000000..430c447cf95 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/MoveLambdaParameterToLastAfter.kt @@ -0,0 +1,6 @@ +fun foo(y: Int, x: () -> Unit) { +} + +fun test() { + foo(1) { 2 } +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/MoveLambdaParameterToLastBefore.kt b/idea/testData/refactoring/changeSignature/MoveLambdaParameterToLastBefore.kt new file mode 100644 index 00000000000..5a8e8160db6 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/MoveLambdaParameterToLastBefore.kt @@ -0,0 +1,6 @@ +fun foo(x: () -> Unit, y: Int) { +} + +fun test() { + foo({ 2 }, 1) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt index 03200d42eb4..5bd7ff6cc41 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt @@ -1618,4 +1618,6 @@ class KotlinChangeSignatureTest : KotlinLightCodeInsightFixtureTestCase() { addParameter(parameterInfo) } } + + fun testMoveLambdaParameterToLast() = doTest { swapParameters(0, 1) } }