diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt index 9e4442d0de8..a84dc7d0fdc 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt @@ -515,14 +515,19 @@ private fun ExtractionData.inferParametersInfo( return null } -private fun ExtractionData.checkDeclarationsMovingOutOfScope(controlFlow: ControlFlow): ErrorMessage? { +private fun ExtractionData.checkDeclarationsMovingOutOfScope( + enclosingDeclaration: JetDeclaration, + controlFlow: ControlFlow +): ErrorMessage? { val declarationsOutOfScope = HashSet() if (controlFlow is JumpBasedControlFlow) { controlFlow.elementToInsertAfterCall.accept( object: JetTreeVisitorVoid() { override fun visitSimpleNameExpression(expression: JetSimpleNameExpression) { val target = expression.getReference()?.resolve() - if (target is JetNamedDeclaration && target.isInsideOf(originalElements)) { + if (target is JetNamedDeclaration + && target.isInsideOf(originalElements) + && target.getParentByType(javaClass(), true) == enclosingDeclaration) { declarationsOutOfScope.add(target) } } @@ -608,7 +613,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult { ) } - checkDeclarationsMovingOutOfScope(controlFlow)?.let { messages.add(it) } + checkDeclarationsMovingOutOfScope(enclosingDeclaration!!, controlFlow)?.let { messages.add(it) } val functionNameValidator = JetNameValidatorImpl( diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInLambdaOnly.kt b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInLambdaOnly.kt new file mode 100644 index 00000000000..7bf6d2a6765 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInLambdaOnly.kt @@ -0,0 +1,13 @@ +class T(val n: Int) + +// SIBLING: +fun foo() { + bar { t -> + val k = 1 + t.n + k + 1 + } +} + +fun bar(f: (T) -> Int) { + +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInLambdaOnly.kt.after b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInLambdaOnly.kt.after new file mode 100644 index 00000000000..6794746f692 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInLambdaOnly.kt.after @@ -0,0 +1,17 @@ +class T(val n: Int) + +// SIBLING: +fun foo() { + unit() +} + +fun unit() { + bar { t -> + val k = 1 + t.n + k + 1 + } +} + +fun bar(f: (T) -> Int) { + +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInNestedBlock.kt b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInNestedBlock.kt new file mode 100644 index 00000000000..0726614f0a3 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInNestedBlock.kt @@ -0,0 +1,9 @@ +class T(val n: Int) + +// SIBLING: +fun foo() { + if (true) { + val k = 1 + T().n + k + 1 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInNestedBlock.kt.after b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInNestedBlock.kt.after new file mode 100644 index 00000000000..ee204246804 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInNestedBlock.kt.after @@ -0,0 +1,13 @@ +class T(val n: Int) + +// SIBLING: +fun foo() { + unit() +} + +fun unit() { + if (true) { + val k = 1 + T().n + k + 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 71a0a0e78f2..7e7b5255bcd 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 @@ -590,6 +590,16 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/outputValues/singleOutputValueWithWhenElse.kt"); } + @TestMetadata("valuesUsedInLambdaOnly.kt") + public void testValuesUsedInLambdaOnly() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInLambdaOnly.kt"); + } + + @TestMetadata("valuesUsedInNestedBlock.kt") + public void testValuesUsedInNestedBlock() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInNestedBlock.kt"); + } + } @TestMetadata("idea/testData/refactoring/extractFunction/controlFlow/throws")