From 65e603c1ed9d5ade780f579e28ff7bfc22b43dfc Mon Sep 17 00:00:00 2001 From: Dimach Date: Thu, 20 Jul 2017 23:35:11 +0300 Subject: [PATCH] KT-13552: Fix J2K to generate else block while converting switch #KT-13552 fixed --- .../jetbrains/kotlin/j2k/SwitchConverter.kt | 16 +++- .../fileOrElement/switch/KT-13552.java | 36 ++++++++ j2k/testData/fileOrElement/switch/KT-13552.kt | 82 +++++++++++++++++++ ...otlinConverterForWebDemoTestGenerated.java | 6 ++ ...otlinConverterSingleFileTestGenerated.java | 6 ++ 5 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 j2k/testData/fileOrElement/switch/KT-13552.java create mode 100644 j2k/testData/fileOrElement/switch/KT-13552.kt diff --git a/j2k/src/org/jetbrains/kotlin/j2k/SwitchConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/SwitchConverter.kt index 1c910303928..eaa5c2b0b6a 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/SwitchConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/SwitchConverter.kt @@ -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() var pendingSelectors = ArrayList() + 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 } diff --git a/j2k/testData/fileOrElement/switch/KT-13552.java b/j2k/testData/fileOrElement/switch/KT-13552.java new file mode 100644 index 00000000000..f582a64f2f2 --- /dev/null +++ b/j2k/testData/fileOrElement/switch/KT-13552.java @@ -0,0 +1,36 @@ +public class SwitchDemo { + public static int test(int i) { + String monthString = ""; + 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; + } + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/switch/KT-13552.kt b/j2k/testData/fileOrElement/switch/KT-13552.kt new file mode 100644 index 00000000000..1980e108f3f --- /dev/null +++ b/j2k/testData/fileOrElement/switch/KT-13552.kt @@ -0,0 +1,82 @@ +object SwitchDemo { + fun test(i: Int): Int { + var monthString = "" + 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() + } + } +} \ No newline at end of file diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index 7be78d054dc..03a11edc822 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -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"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index e1fd2c969c6..77b36eea438 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.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");