diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index 0c77b28243b4..d1cda80e0210 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -1411,6 +1411,11 @@ public abstract class ExtractionTestGenerated extends AbstractExtractionTest { runTest("testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn.kt"); } + @TestMetadata("breakAndReturn1.kt") + public void testBreakAndReturn1() throws Exception { + runTest("testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn1.kt"); + } + @TestMetadata("breakContinueAndDefault.kt") public void testBreakContinueAndDefault() throws Exception { runTest("testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakContinueAndDefault.kt"); diff --git a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/basic/commentPlacement.kt b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/basic/commentPlacement.kt index b81451dd7311..3a609e023a81 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/basic/commentPlacement.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/basic/commentPlacement.kt @@ -5,6 +5,4 @@ fun main() { // comment if (true) return println() -} - -// IGNORE_K1 \ No newline at end of file +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/basic/commentPlacement.kt.after b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/basic/commentPlacement.kt.after index 3b52e5774e6c..7e941e93460a 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/basic/commentPlacement.kt.after +++ b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/basic/commentPlacement.kt.after @@ -1,7 +1,7 @@ fun main() { println() - __dummyTestFun__() + } private fun __dummyTestFun__() { @@ -9,5 +9,3 @@ private fun __dummyTestFun__() { if (true) return println() } - -// IGNORE_K1 diff --git a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn.kt.fir.after b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn.kt.fir.after new file mode 100644 index 000000000000..1035e5a04976 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn.kt.fir.after @@ -0,0 +1,19 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo +// PARAM_DESCRIPTOR: val b: kotlin.Int defined in foo +// SIBLING: +fun foo(a: Int) { + val b: Int = 1 + for (n in 1..b) { + __dummyTestFun__(a, b) + return + } +} + +private fun __dummyTestFun__(a: Int, b: Int) { + if (a > 0) throw Exception("") + if (a + b > 0) return + println(a - b) + return +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn1.kt b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn1.kt new file mode 100644 index 000000000000..ec8957e47f8b --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn1.kt @@ -0,0 +1,15 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo +// PARAM_DESCRIPTOR: val b: kotlin.Int defined in foo +// SIBLING: +fun foo(a: Int) { + val b: Int = 1 + for (n in 1..b) { + if (a > 0) throw Exception("") + if (a + b > 0) break + println(a - b) + return + } + println() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn1.kt.conflicts b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn1.kt.conflicts new file mode 100644 index 000000000000..f856f3cc0ad4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn1.kt.conflicts @@ -0,0 +1 @@ +Selected code fragment has multiple exit points diff --git a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt index 85580491b087..83e80b433963 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt @@ -10,6 +10,4 @@ fun foo(a: Int) { if (b + a > 0) return println(a - b) println(a + b) -} - -// IGNORE_K2 \ No newline at end of file +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt.after b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt.after index 788b42f68de3..3380115aeb3b 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt.after +++ b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt.after @@ -15,6 +15,4 @@ private fun b(a: Int, b: Int): Boolean { if (b + a > 0) return true println(a - b) return false -} - -// IGNORE_K2 \ No newline at end of file +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt.fir.after b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt.fir.after new file mode 100644 index 000000000000..4b73cd66ba35 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt.fir.after @@ -0,0 +1,18 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo +// PARAM_DESCRIPTOR: val b: kotlin.Int defined in foo +// SIBLING: +fun foo(a: Int) { + val b: Int = 1 + + if (bool(a, b)) return + println(a + b) +} + +private fun bool(a: Int, b: Int): Boolean { + if (a > 0) throw Exception("") + if (b + a > 0) return true + println(a - b) + return false +} \ No newline at end of file diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.common/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractFunctionGenerator.kt b/plugins/kotlin/refactorings/kotlin.refactorings.common/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractFunctionGenerator.kt index 52b59c0f9a90..f1ba55ba543d 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.common/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractFunctionGenerator.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.common/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractFunctionGenerator.kt @@ -404,7 +404,10 @@ abstract class ExtractFunctionGenerator { val elementToInsertAfterCall = outputValue.elementToInsertAfterCall when { - elementToInsertAfterCall == null -> Collections.singletonList(psiFactory.createExpression(callText)) + elementToInsertAfterCall == null -> listOf( + newLine, + psiFactory.createExpression(callText) + ) outputValue.conditional -> Collections.singletonList( psiFactory.createExpression("if ($callText) ${elementToInsertAfterCall.text}") ) diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/introduce/extractionEngine/ExtractionDataAnalyzer.kt b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/introduce/extractionEngine/ExtractionDataAnalyzer.kt index 60abe69789c4..b78b4ef96717 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/introduce/extractionEngine/ExtractionDataAnalyzer.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/introduce/extractionEngine/ExtractionDataAnalyzer.kt @@ -175,7 +175,7 @@ internal class ExtractionDataAnalyzer(private val extractionData: ExtractionData typeOfDefaultFlow = approximateWithResolvableType(typeOfDefaultFlow, scope) ?: builtinTypes.UNIT, valuedReturnExpressions = exitSnapshot.valuedReturnExpressions.filter { it is KtReturnExpression }, returnValueType = approximateWithResolvableType(exitSnapshot.returnValueType, scope) ?: builtinTypes.UNIT, - jumpExpressions = exitSnapshot.jumpExpressions.filter { it is KtBreakExpression || it is KtContinueExpression }, + jumpExpressions = exitSnapshot.jumpExpressions.filter { it is KtBreakExpression || it is KtContinueExpression || it is KtReturnExpression && it.returnedExpression == null}, hasSingleTarget = !exitSnapshot.hasMultipleJumpTargets, sameExitForDefaultAndJump = if (exitSnapshot.hasJumps) !exitSnapshot.hasEscapingJumps && defaultExpressionInfo != null else defaultExpressionInfo == null ) diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/introduceFunction/K2IntroduceFunctionTestGenerated.java b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/introduceFunction/K2IntroduceFunctionTestGenerated.java index 99c35addef6d..d00f0f37fc88 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/introduceFunction/K2IntroduceFunctionTestGenerated.java +++ b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/introduceFunction/K2IntroduceFunctionTestGenerated.java @@ -579,6 +579,11 @@ public abstract class K2IntroduceFunctionTestGenerated extends AbstractK2Introdu runTest("../../idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn.kt"); } + @TestMetadata("breakAndReturn1.kt") + public void testBreakAndReturn1() throws Exception { + runTest("../../idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakAndReturn1.kt"); + } + @TestMetadata("breakContinueAndDefault.kt") public void testBreakContinueAndDefault() throws Exception { runTest("../../idea/tests/testData/refactoring/extractFunction/controlFlow/exitPointEquivalence/breakContinueAndDefault.kt");