diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractableCodeDescriptor.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractableCodeDescriptor.kt index bb95f405865..ee7c3063d07 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractableCodeDescriptor.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractableCodeDescriptor.kt @@ -305,6 +305,7 @@ fun ControlFlow.toDefault(): ControlFlow = data class ExtractableCodeDescriptor( val extractionData: ExtractionData, + val originalContext: BindingContext, val name: String, val visibility: String, val parameters: List, diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractableAnalysisUtil.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractableAnalysisUtil.kt index 12ae03e2268..9d2ba16f946 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractableAnalysisUtil.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractableAnalysisUtil.kt @@ -729,6 +729,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult { return AnalysisResult( ExtractableCodeDescriptor( this, + bindingContext, functionName, if (isVisibilityApplicable()) "private" else "", adjustedParameters.sortBy { it.name }, diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractorUtil.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractorUtil.kt index f58107623de..43828eb2574 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractorUtil.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractorUtil.kt @@ -193,7 +193,7 @@ fun ExtractableCodeDescriptor.findDuplicates(): List { } private fun makeCall( - name: String, + extractableDescriptor: ExtractableCodeDescriptor, declaration: JetNamedDeclaration, controlFlow: ControlFlow, rangeToReplace: JetPsiRange, @@ -202,8 +202,7 @@ private fun makeCall( val firstExpression = rangeToReplace.elements.firstOrNull { it is JetExpression } as? JetExpression if (firstExpression?.isFunctionLiteralOutsideParentheses() ?: false) { val functionLiteralArgument = PsiTreeUtil.getParentOfType(firstExpression, javaClass())!! - //todo use the right binding context - functionLiteralArgument.moveInsideParenthesesAndReplaceWith(wrappedCall, BindingContext.EMPTY) + functionLiteralArgument.moveInsideParenthesesAndReplaceWith(wrappedCall, extractableDescriptor.originalContext) return } anchor.replace(wrappedCall) @@ -223,8 +222,8 @@ private fun makeCall( val callText = when (declaration) { is JetNamedFunction -> - arguments.joinToString(separator = ", ", prefix = "${name}(", postfix = ")") - else -> name + arguments.joinToString(separator = ", ", prefix = "${extractableDescriptor.name}(", postfix = ")") + else -> extractableDescriptor.name } val anchorInBlock = stream(anchor) { it.getParent() }.firstOrNull { it.getParent() is JetBlockExpression } @@ -512,9 +511,9 @@ fun ExtractableCodeDescriptor.generateDeclaration(options: ExtractionGeneratorOp if (options.inTempFile) return ExtractionResult(declaration, Collections.emptyMap(), nameByOffset) - makeCall(name, declaration, controlFlow, extractionData.originalRange, parameters.map { it.argumentText }) + makeCall(this, declaration, controlFlow, extractionData.originalRange, parameters.map { it.argumentText }) ShortenReferences.process(declaration) - val duplicateReplacers = duplicates.map { it.range to { makeCall(name, declaration, it.controlFlow, it.range, it.arguments) } }.toMap() + val duplicateReplacers = duplicates.map { it.range to { makeCall(this, declaration, it.controlFlow, it.range, it.arguments) } }.toMap() return ExtractionResult(declaration, duplicateReplacers, nameByOffset) } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinExtractFunctionDialog.java b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinExtractFunctionDialog.java index 3425848233d..d066068792c 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinExtractFunctionDialog.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinExtractFunctionDialog.java @@ -258,6 +258,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { return new ExtractableCodeDescriptor( descriptor.getExtractionData(), + descriptor.getOriginalContext(), getFunctionName(), getVisibility(), ContainerUtil.newArrayList(oldToNewParameters.values()), diff --git a/idea/testData/refactoring/extractFunction/controlFlow/evaluateExpression/trailingLambdaNonEmptyArgListWithNamedArgs.kt b/idea/testData/refactoring/extractFunction/controlFlow/evaluateExpression/trailingLambdaNonEmptyArgListWithNamedArgs.kt new file mode 100644 index 00000000000..18279894425 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/controlFlow/evaluateExpression/trailingLambdaNonEmptyArgListWithNamedArgs.kt @@ -0,0 +1,6 @@ +fun Array.check(a: Int, b: Int, f: (T) -> Boolean): Boolean = false + +// SIBLING: +fun foo(t: Array) { + t.check(a = 1, b = 2) { it + 1 > 1 } +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/controlFlow/evaluateExpression/trailingLambdaNonEmptyArgListWithNamedArgs.kt.after b/idea/testData/refactoring/extractFunction/controlFlow/evaluateExpression/trailingLambdaNonEmptyArgListWithNamedArgs.kt.after new file mode 100644 index 00000000000..2eadb35c20b --- /dev/null +++ b/idea/testData/refactoring/extractFunction/controlFlow/evaluateExpression/trailingLambdaNonEmptyArgListWithNamedArgs.kt.after @@ -0,0 +1,10 @@ +fun Array.check(a: Int, b: Int, f: (T) -> Boolean): Boolean = false + +// SIBLING: +fun foo(t: Array) { + t.check(a = 1, b = 2, f = function()) +} + +private fun function(): (Int) -> Boolean { + return { it + 1 > 1 } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index cdac35c08ce..0d9eb5a4a82 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -665,6 +665,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest(fileName); } + @TestMetadata("trailingLambdaNonEmptyArgListWithNamedArgs.kt") + public void testTrailingLambdaNonEmptyArgListWithNamedArgs() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/evaluateExpression/trailingLambdaNonEmptyArgListWithNamedArgs.kt"); + doExtractFunctionTest(fileName); + } + } @TestMetadata("idea/testData/refactoring/extractFunction/controlFlow/initializer")