Java to Kotlin converter: better switch conversion in case of code block in case
This commit is contained in:
@@ -216,18 +216,33 @@ open class StatementVisitor(public val converter: Converter) : JavaElementVisito
|
|||||||
|
|
||||||
fun isSwitchBreak(statement: PsiStatement) = statement is PsiBreakStatement && statement.getLabelIdentifier() == null
|
fun isSwitchBreak(statement: PsiStatement) = statement is PsiBreakStatement && statement.getLabelIdentifier() == null
|
||||||
|
|
||||||
fun convertStatements(statements: List<PsiStatement>): List<Statement>
|
fun convertStatements(statements: List<PsiStatement>): List<Statement> {
|
||||||
= statements.filterNot(::isSwitchBreak).map { converter.convertStatement(it) }
|
val statementsToKeep = statements.filterNot(::isSwitchBreak)
|
||||||
|
if (statementsToKeep.size == 1) {
|
||||||
|
val block = statementsToKeep.single() as? PsiBlockStatement
|
||||||
|
if (block != null) {
|
||||||
|
return listOf(converter.convertBlock(block.getCodeBlock(), true, { !isSwitchBreak(it) }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return statementsToKeep.map { converter.convertStatement(it) }
|
||||||
|
}
|
||||||
|
|
||||||
fun convertCaseStatements(caseIndex: Int): List<Statement> {
|
fun convertCaseStatements(caseIndex: Int): List<Statement> {
|
||||||
val case = cases[caseIndex]
|
val case = cases[caseIndex]
|
||||||
return if (case.statements.any { it is PsiBreakStatement || it is PsiContinueStatement || it is PsiReturnStatement || it is PsiThrowStatement } ||
|
val fallsThrough = if (caseIndex == cases.lastIndex) {
|
||||||
caseIndex == cases.lastIndex) {
|
false
|
||||||
convertStatements(case.statements)
|
|
||||||
}
|
}
|
||||||
else { // otherwise we fall through into the next case
|
else {
|
||||||
|
val block = case.statements.singleOrNull2() as? PsiBlockStatement
|
||||||
|
val statements = if (block != null) block.getCodeBlock().getStatements().toList() else case.statements
|
||||||
|
!statements.any { it is PsiBreakStatement || it is PsiContinueStatement || it is PsiReturnStatement || it is PsiThrowStatement }
|
||||||
|
}
|
||||||
|
return if (fallsThrough) { // we fall through into the next case
|
||||||
convertStatements(case.statements) + convertCaseStatements(caseIndex + 1)
|
convertStatements(case.statements) + convertCaseStatements(caseIndex + 1)
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
convertStatements(case.statements)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun convertCaseStatementsToBody(caseIndex: Int): Statement {
|
fun convertCaseStatementsToBody(caseIndex: Int): Statement {
|
||||||
@@ -399,4 +414,7 @@ open class StatementVisitor(public val converter: Converter) : JavaElementVisito
|
|||||||
else
|
else
|
||||||
converter.convertStatement(statement)
|
converter.convertStatement(statement)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun <T: Any> List<T>.singleOrNull2(): T?
|
||||||
|
= if (size == 1) this[0] else null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2596,6 +2596,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv
|
|||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("j2k/tests/testData/ast/switch"), Pattern.compile("^(.+)\\.java$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("j2k/tests/testData/ast/switch"), Pattern.compile("^(.+)\\.java$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("caseWithBlock.java")
|
||||||
|
public void testCaseWithBlock() throws Exception {
|
||||||
|
doTest("j2k/tests/testData/ast/switch/caseWithBlock.java");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("comlicatedFallDown.java")
|
@TestMetadata("comlicatedFallDown.java")
|
||||||
public void testComlicatedFallDown() throws Exception {
|
public void testComlicatedFallDown() throws Exception {
|
||||||
doTest("j2k/tests/testData/ast/switch/comlicatedFallDown.java");
|
doTest("j2k/tests/testData/ast/switch/comlicatedFallDown.java");
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
//method
|
||||||
|
void foo() {
|
||||||
|
switch(a) {
|
||||||
|
case 1: {
|
||||||
|
int x = 1;
|
||||||
|
System.out.println(x);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2: {
|
||||||
|
int x = 2;
|
||||||
|
System.out.println(x);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: {
|
||||||
|
System.out.println(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
fun foo() {
|
||||||
|
when (a) {
|
||||||
|
1 -> {
|
||||||
|
val x = 1
|
||||||
|
System.out.println(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
2 -> {
|
||||||
|
val x = 2
|
||||||
|
System.out.println(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
3 -> {
|
||||||
|
System.out.println(3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user