diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt index ee5fece9b89..3b10f43df59 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.core.getResolutionScope +import org.jetbrains.kotlin.idea.core.moveInsideParenthesesAndReplaceWith import org.jetbrains.kotlin.idea.core.refactoring.runRefactoringWithPostprocessing import org.jetbrains.kotlin.idea.refactoring.JetRefactoringBundle import org.jetbrains.kotlin.idea.refactoring.changeSignature.* @@ -268,7 +269,10 @@ public open class KotlinIntroduceParameterHandler( null, fun() { val isTestMode = ApplicationManager.getApplication().isUnitTestMode() - val inplaceIsAvailable = editor.getSettings().isVariableInplaceRenameEnabled() && !isTestMode + val haveLambdaArgumentsToReplace = occurrencesToReplace.any { + it.elements.any { it is JetFunctionLiteralExpression && it.parent is JetFunctionLiteralArgument } + } + val inplaceIsAvailable = editor.settings.isVariableInplaceRenameEnabled && !isTestMode && !haveLambdaArgumentsToReplace val originalExpression = JetPsiUtil.safeDeparenthesize(expression) val psiFactory = JetPsiFactory(project) @@ -285,7 +289,16 @@ public open class KotlinIntroduceParameterHandler( parametersUsages = parametersUsages, occurrencesToReplace = occurrencesToReplace, occurrenceReplacer = { - it.elements.single().replace(psiFactory.createExpression(newParameterName)) + val expressionToReplace = it.elements.single() as JetExpression + val replacingExpression = psiFactory.createExpression(newParameterName) + if (expressionToReplace.isFunctionLiteralOutsideParentheses()) { + expressionToReplace + .getStrictParentOfType()!! + .moveInsideParenthesesAndReplaceWith(replacingExpression, context) + } + else { + expressionToReplace.replace(replacingExpression) + } } ) ) diff --git a/idea/testData/refactoring/introduceLambdaParameter/lambdaArgument.kt b/idea/testData/refactoring/introduceLambdaParameter/lambdaArgument.kt new file mode 100644 index 00000000000..ea1a8ba2f37 --- /dev/null +++ b/idea/testData/refactoring/introduceLambdaParameter/lambdaArgument.kt @@ -0,0 +1,2 @@ +// WITH_RUNTIME +fun foo(list: List) = list.filter { it.length() > 6 } \ No newline at end of file diff --git a/idea/testData/refactoring/introduceLambdaParameter/lambdaArgument.kt.after b/idea/testData/refactoring/introduceLambdaParameter/lambdaArgument.kt.after new file mode 100644 index 00000000000..68abb9310bb --- /dev/null +++ b/idea/testData/refactoring/introduceLambdaParameter/lambdaArgument.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +fun foo(list: List, function: () -> (String) -> Boolean = { { it.length() > 6 } }) = list.filter(function()) \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/lambdaArgument.kt b/idea/testData/refactoring/introduceParameter/lambdaArgument.kt new file mode 100644 index 00000000000..ea1a8ba2f37 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/lambdaArgument.kt @@ -0,0 +1,2 @@ +// WITH_RUNTIME +fun foo(list: List) = list.filter { it.length() > 6 } \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/lambdaArgument.kt.after b/idea/testData/refactoring/introduceParameter/lambdaArgument.kt.after new file mode 100644 index 00000000000..a642c6a90be --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/lambdaArgument.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +fun foo(list: List, function: (String) -> Boolean = { it.length() > 6 }) = list.filter(function) \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java index c2ac4eefee6..aecaae99df2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java @@ -2749,6 +2749,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doIntroduceSimpleParameterTest(fileName); } + @TestMetadata("lambdaArgument.kt") + public void testLambdaArgument() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/lambdaArgument.kt"); + doIntroduceSimpleParameterTest(fileName); + } + @TestMetadata("localVar.kt") public void testLocalVar() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/localVar.kt"); @@ -2890,6 +2896,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/refactoring/introduceLambdaParameter"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("lambdaArgument.kt") + public void testLambdaArgument() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/lambdaArgument.kt"); + doIntroduceLambdaParameterTest(fileName); + } + @TestMetadata("lambdaParamInPrimaryConstructor.kt") public void testLambdaParamInPrimaryConstructor() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/lambdaParamInPrimaryConstructor.kt");