KT-13552: Fix J2K to generate else block while converting switch
#KT-13552 fixed
This commit is contained in:
@@ -19,10 +19,9 @@ package org.jetbrains.kotlin.j2k
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.controlFlow.ControlFlowFactory
|
||||
import com.intellij.psi.controlFlow.ControlFlowUtil
|
||||
import com.intellij.psi.controlFlow.LocalsOrMyInstanceFieldsControlFlowPolicy
|
||||
import org.jetbrains.kotlin.j2k.ast.*
|
||||
import java.util.*
|
||||
import com.intellij.psi.controlFlow.LocalsOrMyInstanceFieldsControlFlowPolicy
|
||||
|
||||
|
||||
|
||||
class SwitchConverter(private val codeConverter: CodeConverter) {
|
||||
@@ -38,17 +37,26 @@ class SwitchConverter(private val codeConverter: CodeConverter) {
|
||||
|
||||
val result = ArrayList<WhenEntry>()
|
||||
var pendingSelectors = ArrayList<WhenEntrySelector>()
|
||||
var defaultSelector: WhenEntrySelector? = null
|
||||
var defaultEntry: WhenEntry? = null
|
||||
for ((i, case) in cases.withIndex()) {
|
||||
if (case.label == null) { // invalid switch - no case labels
|
||||
result.add(WhenEntry(listOf(ValueWhenEntrySelector(Expression.Empty).assignNoPrototype()), convertCaseStatementsToBody(cases, i)).assignNoPrototype())
|
||||
continue
|
||||
}
|
||||
pendingSelectors.add(codeConverter.convertStatement(case.label) as WhenEntrySelector)
|
||||
val sel = codeConverter.convertStatement(case.label) as WhenEntrySelector
|
||||
if (case.label.isDefaultCase) defaultSelector = sel else pendingSelectors.add(sel)
|
||||
if (case.statements.isNotEmpty()) {
|
||||
result.add(WhenEntry(pendingSelectors, convertCaseStatementsToBody(cases, i)).assignNoPrototype())
|
||||
val statement = convertCaseStatementsToBody(cases, i)
|
||||
if (pendingSelectors.isNotEmpty())
|
||||
result.add(WhenEntry(pendingSelectors, statement).assignNoPrototype())
|
||||
if (defaultSelector != null)
|
||||
defaultEntry = WhenEntry(listOf(defaultSelector), statement).assignNoPrototype()
|
||||
pendingSelectors = ArrayList()
|
||||
defaultSelector = null
|
||||
}
|
||||
}
|
||||
defaultEntry?.let(result::add)
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
public class SwitchDemo {
|
||||
public static int test(int i) {
|
||||
String monthString = "<empty>";
|
||||
switch (i) {
|
||||
case 1: print(1);
|
||||
case 2: print(2);
|
||||
case 3: print(3);
|
||||
default:
|
||||
case 4: print(4);
|
||||
case 5: print(5); break;
|
||||
case 6: print(6);
|
||||
case 7: print(7);
|
||||
case 8: print(8);
|
||||
case 9: print(9);
|
||||
case 10: print(10);
|
||||
case 11: print(11);
|
||||
case 12: monthString = "December"; break;
|
||||
}
|
||||
String status="";
|
||||
switch (status) {
|
||||
case "init":
|
||||
case "dial":
|
||||
case "transmit":
|
||||
return 0x111111;
|
||||
case "ok":
|
||||
return 0xFF006600;
|
||||
case "cancel":
|
||||
return 0xFF666666;
|
||||
case "fail":
|
||||
case "busy":
|
||||
case "error":
|
||||
default:
|
||||
return 0xFF660000;
|
||||
}
|
||||
}
|
||||
}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
object SwitchDemo {
|
||||
fun test(i: Int): Int {
|
||||
var monthString = "<empty>"
|
||||
when (i) {
|
||||
1 -> {
|
||||
print(1)
|
||||
print(2)
|
||||
print(3)
|
||||
print(4)
|
||||
print(5)
|
||||
}
|
||||
2 -> {
|
||||
print(2)
|
||||
print(3)
|
||||
print(4)
|
||||
print(5)
|
||||
}
|
||||
3 -> {
|
||||
print(3)
|
||||
print(4)
|
||||
print(5)
|
||||
}
|
||||
4 -> {
|
||||
print(4)
|
||||
print(5)
|
||||
}
|
||||
5 -> print(5)
|
||||
6 -> {
|
||||
print(6)
|
||||
print(7)
|
||||
print(8)
|
||||
print(9)
|
||||
print(10)
|
||||
print(11)
|
||||
monthString = "December"
|
||||
}
|
||||
7 -> {
|
||||
print(7)
|
||||
print(8)
|
||||
print(9)
|
||||
print(10)
|
||||
print(11)
|
||||
monthString = "December"
|
||||
}
|
||||
8 -> {
|
||||
print(8)
|
||||
print(9)
|
||||
print(10)
|
||||
print(11)
|
||||
monthString = "December"
|
||||
}
|
||||
9 -> {
|
||||
print(9)
|
||||
print(10)
|
||||
print(11)
|
||||
monthString = "December"
|
||||
}
|
||||
10 -> {
|
||||
print(10)
|
||||
print(11)
|
||||
monthString = "December"
|
||||
}
|
||||
11 -> {
|
||||
print(11)
|
||||
monthString = "December"
|
||||
}
|
||||
12 -> monthString = "December"
|
||||
else -> {
|
||||
print(4)
|
||||
print(5)
|
||||
}
|
||||
}
|
||||
val status = ""
|
||||
when (status) {
|
||||
"init", "dial", "transmit" -> return 0x111111
|
||||
"ok" -> return 0xFF006600.toInt()
|
||||
"cancel" -> return 0xFF666666.toInt()
|
||||
"fail", "busy", "error" -> return 0xFF660000.toInt()
|
||||
else -> return 0xFF660000.toInt()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4556,6 +4556,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("KT-13552.java")
|
||||
public void testKT_13552() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/switch/KT-13552.java");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt-539.java")
|
||||
public void testKt_539() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/switch/kt-539.java");
|
||||
|
||||
@@ -4556,6 +4556,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("KT-13552.java")
|
||||
public void testKT_13552() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/switch/KT-13552.java");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt-539.java")
|
||||
public void testKt_539() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/switch/kt-539.java");
|
||||
|
||||
Reference in New Issue
Block a user