Extract Function: Allow to combine throws with other exit points

This commit is contained in:
Alexey Sedunov
2014-04-24 18:22:02 +04:00
parent 2cfd7de8d9
commit 243ba62b65
13 changed files with 133 additions and 10 deletions
@@ -169,11 +169,10 @@ private fun List<Instruction>.analyzeControlFlow(
val element = it.getElement()
if (element is JetReturnExpression
|| element is JetBreakExpression
|| element is JetContinueExpression
|| element is JetThrowExpression) {
|| element is JetContinueExpression) {
jumpExits.add(it)
}
else {
else if (element !is JetThrowExpression) {
defaultExits.add(it)
}
}
@@ -0,0 +1,9 @@
// NEXT_SIBLING:
fun foo(a: Int): Int {
val b: Int = 1
for (n in 1..b) {
<selection>if (a > 0) throw Exception("")
if (a + b > 0) break
println(a - b)</selection>
}
}
@@ -0,0 +1,14 @@
// NEXT_SIBLING:
fun b(a: Int, b: Int): Boolean {
if (a > 0) throw Exception("")
if (a + b > 0) return true
println(a - b)
return false
}
fun foo(a: Int): Int {
val b: Int = 1
for (n in 1..b) {
if (b(a, b)) break
}
}
@@ -0,0 +1,9 @@
// NEXT_SIBLING:
fun foo(a: Int): Int {
val b: Int = 1
for (n in 1..b) {
<selection>if (a > 0) throw Exception("")
if (a + b > 0) continue
println(a - b)</selection>
}
}
@@ -0,0 +1,14 @@
// NEXT_SIBLING:
fun b(a: Int, b: Int): Boolean {
if (a > 0) throw Exception("")
if (a + b > 0) return true
println(a - b)
return false
}
fun foo(a: Int): Int {
val b: Int = 1
for (n in 1..b) {
if (b(a, b)) continue
}
}
@@ -0,0 +1,11 @@
// NEXT_SIBLING:
fun i(a: Int, b: Int): Int {
return if (a > 0) throw Exception("") else a + b
}
fun foo(a: Int): Int {
val b: Int = 1
val t = i(a, b)
return t
}
@@ -0,0 +1,8 @@
// NEXT_SIBLING:
fun foo(a: Int) {
val b: Int = 1
<selection>if (a > 0) throw Exception("")
if (b + a > 0) return
println(a - b)</selection>
}
@@ -0,0 +1,13 @@
// NEXT_SIBLING:
fun b(a: Int, b: Int): Boolean {
if (a > 0) throw Exception("")
if (b + a > 0) return true
println(a - b)
return false
}
fun foo(a: Int) {
val b: Int = 1
if (b(a, b)) return
}
@@ -0,0 +1,7 @@
// NEXT_SIBLING:
fun foo(a: Int): Int {
val b: Int = 1
<selection>if (a > 0) throw Exception("") else return a + b
return a - b</selection>
}
@@ -0,0 +1,11 @@
// NEXT_SIBLING:
fun i(a: Int, b: Int): Int {
if (a > 0) throw Exception("") else return a + b
return a - b
}
fun foo(a: Int): Int {
val b: Int = 1
return i(a, b)
}
@@ -1 +0,0 @@
Selected code fragment has multiple exit points
@@ -241,7 +241,7 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
}
@TestMetadata("idea/testData/refactoring/extractFunction/controlFlow")
@InnerTestClasses({ControlFlow.ConditionalJumps.class, ControlFlow.Default.class, ControlFlow.DefiniteReturns.class, ControlFlow.EvaluateExpression.class, ControlFlow.OutputValues.class, ControlFlow.Unextractable.class})
@InnerTestClasses({ControlFlow.ConditionalJumps.class, ControlFlow.Default.class, ControlFlow.DefiniteReturns.class, ControlFlow.EvaluateExpression.class, ControlFlow.OutputValues.class, ControlFlow.Throws.class, ControlFlow.Unextractable.class})
public static class ControlFlow extends AbstractJetExtractionTest {
public void testAllFilesPresentInControlFlow() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/refactoring/extractFunction/controlFlow"), Pattern.compile("^(.+)\\.kt$"), true);
@@ -412,6 +412,39 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
}
@TestMetadata("idea/testData/refactoring/extractFunction/controlFlow/throws")
public static class Throws extends AbstractJetExtractionTest {
public void testAllFilesPresentInThrows() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/refactoring/extractFunction/controlFlow/throws"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("breakWithThrow.kt")
public void testBreakWithThrow() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/throws/breakWithThrow.kt");
}
@TestMetadata("continueWithThrow.kt")
public void testContinueWithThrow() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/throws/continueWithThrow.kt");
}
@TestMetadata("evalExpressionWithThrow.kt")
public void testEvalExpressionWithThrow() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/throws/evalExpressionWithThrow.kt");
}
@TestMetadata("nonValuedReturnWithThrow.kt")
public void testNonValuedReturnWithThrow() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/throws/nonValuedReturnWithThrow.kt");
}
@TestMetadata("returnWithThrow.kt")
public void testReturnWithThrow() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/throws/returnWithThrow.kt");
}
}
@TestMetadata("idea/testData/refactoring/extractFunction/controlFlow/unextractable")
public static class Unextractable extends AbstractJetExtractionTest {
public void testAllFilesPresentInUnextractable() throws Exception {
@@ -428,11 +461,6 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/unextractable/evalExpressionWithReturn.kt");
}
@TestMetadata("evalExpressionWithThrow.kt")
public void testEvalExpressionWithThrow() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/unextractable/evalExpressionWithThrow.kt");
}
@TestMetadata("jumpsAndReturns.kt")
public void testJumpsAndReturns() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/controlFlow/unextractable/jumpsAndReturns.kt");
@@ -478,6 +506,7 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
suite.addTestSuite(DefiniteReturns.class);
suite.addTestSuite(EvaluateExpression.class);
suite.addTestSuite(OutputValues.class);
suite.addTestSuite(Throws.class);
suite.addTestSuite(Unextractable.class);
return suite;
}