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");