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.*
|
||||||
import com.intellij.psi.controlFlow.ControlFlowFactory
|
import com.intellij.psi.controlFlow.ControlFlowFactory
|
||||||
import com.intellij.psi.controlFlow.ControlFlowUtil
|
import com.intellij.psi.controlFlow.ControlFlowUtil
|
||||||
|
import com.intellij.psi.controlFlow.LocalsOrMyInstanceFieldsControlFlowPolicy
|
||||||
import org.jetbrains.kotlin.j2k.ast.*
|
import org.jetbrains.kotlin.j2k.ast.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import com.intellij.psi.controlFlow.LocalsOrMyInstanceFieldsControlFlowPolicy
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SwitchConverter(private val codeConverter: CodeConverter) {
|
class SwitchConverter(private val codeConverter: CodeConverter) {
|
||||||
@@ -38,17 +37,26 @@ class SwitchConverter(private val codeConverter: CodeConverter) {
|
|||||||
|
|
||||||
val result = ArrayList<WhenEntry>()
|
val result = ArrayList<WhenEntry>()
|
||||||
var pendingSelectors = ArrayList<WhenEntrySelector>()
|
var pendingSelectors = ArrayList<WhenEntrySelector>()
|
||||||
|
var defaultSelector: WhenEntrySelector? = null
|
||||||
|
var defaultEntry: WhenEntry? = null
|
||||||
for ((i, case) in cases.withIndex()) {
|
for ((i, case) in cases.withIndex()) {
|
||||||
if (case.label == null) { // invalid switch - no case labels
|
if (case.label == null) { // invalid switch - no case labels
|
||||||
result.add(WhenEntry(listOf(ValueWhenEntrySelector(Expression.Empty).assignNoPrototype()), convertCaseStatementsToBody(cases, i)).assignNoPrototype())
|
result.add(WhenEntry(listOf(ValueWhenEntrySelector(Expression.Empty).assignNoPrototype()), convertCaseStatementsToBody(cases, i)).assignNoPrototype())
|
||||||
continue
|
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()) {
|
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()
|
pendingSelectors = ArrayList()
|
||||||
|
defaultSelector = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
defaultEntry?.let(result::add)
|
||||||
return result
|
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);
|
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")
|
@TestMetadata("kt-539.java")
|
||||||
public void testKt_539() throws Exception {
|
public void testKt_539() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/switch/kt-539.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/switch/kt-539.java");
|
||||||
|
|||||||
@@ -4556,6 +4556,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("kt-539.java")
|
||||||
public void testKt_539() throws Exception {
|
public void testKt_539() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/switch/kt-539.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/switch/kt-539.java");
|
||||||
|
|||||||
Reference in New Issue
Block a user