KT-13552: Fix J2K to generate else block while converting switch

#KT-13552 fixed
This commit is contained in:
Dimach
2017-07-20 23:35:11 +03:00
committed by Simon Ogorodnik
parent 44790eccaf
commit 65e603c1ed
5 changed files with 142 additions and 4 deletions
@@ -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
View File
@@ -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
View File
@@ -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");