diff --git a/src/org/jetbrains/jet/j2k/ast/Statements.kt b/src/org/jetbrains/jet/j2k/ast/Statements.kt index a924e7245e3..956c2406ece 100644 --- a/src/org/jetbrains/jet/j2k/ast/Statements.kt +++ b/src/org/jetbrains/jet/j2k/ast/Statements.kt @@ -111,7 +111,7 @@ public open class CaseContainer(val caseStatement: List, statements: Li { val newStatements = statements.filterNot { it is BreakStatement || it is ContinueStatement } - myBlock = Block(newStatements, false) + myBlock = Block(newStatements, true) } public override fun toKotlin() = caseStatement.toKotlin(", ") + " -> " + myBlock.toKotlin() diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt index 7c13f3a8c29..500c2e22a74 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt @@ -158,31 +158,37 @@ public open class StatementVisitor(converter: Converter): ElementVisitor(convert val result = ArrayList() var pendingLabels = ArrayList() var i: Int = 0 + var hasDefaultCase: Boolean = false for (ls in cases) { // TODO assert {(ls?.size()).sure() > 0} - var label = ls[0] - // TODO assert {(label is PsiSwitchLabelStatement?)} - // TODO assert("not a right index") {allSwitchStatements?.get(i) == label} - if (ls.size() > 1) { - pendingLabels.add(getConverter().statementToStatement(label)) - val slice: List = ls.subList(1, (ls.size())) - if (!containsBreak(slice)) { - val statements = ArrayList(getConverter().statementsToStatementList(slice)) - statements.addAll(getConverter().statementsToStatementList(getAllToNextBreak(allSwitchStatements, i + ls.size()))) - result.add(CaseContainer(pendingLabels, statements)) - pendingLabels = arrayList() + if (ls.size() > 0) { + var label = ls[0] + hasDefaultCase = hasDefaultCase || (label as PsiSwitchLabelStatement).isDefaultCase() + // TODO assert {(label is PsiSwitchLabelStatement?)} + // TODO assert("not a right index") {allSwitchStatements?.get(i) == label} + if (ls.size() > 1) { + pendingLabels.add(getConverter().statementToStatement(label)) + val slice: List = ls.subList(1, (ls.size())) + if (!containsBreak(slice)) { + val statements = ArrayList(getConverter().statementsToStatementList(slice)) + statements.addAll(getConverter().statementsToStatementList(getAllToNextBreak(allSwitchStatements, i + ls.size()))) + result.add(CaseContainer(pendingLabels, statements)) + pendingLabels = ArrayList() + } + else { + result.add(CaseContainer(pendingLabels, getConverter().statementsToStatementList(slice))) + pendingLabels = ArrayList() + } } else { - result.add(CaseContainer(pendingLabels, getConverter().statementsToStatementList(slice))) - pendingLabels = arrayList() + pendingLabels.add(getConverter().statementToStatement(label)) } + i += ls.size() } - else { - pendingLabels.add(getConverter().statementToStatement(label)) - } - i += ls.size() } - return result + if (!hasDefaultCase) + result.add(CaseContainer(listOf(DefaultSwitchLabelStatement()), ArrayList())) + return result } public override fun visitSynchronizedStatement(statement: PsiSynchronizedStatement?): Unit { @@ -262,7 +268,7 @@ public open class StatementVisitor(converter: Converter): ElementVisitor(convert } else { cases.add(currentCaseStatements) - currentCaseStatements = arrayList() + currentCaseStatements = ArrayList() } } diff --git a/tests/testData/ast/switch/file/emptySwitch.jav b/tests/testData/ast/switch/file/emptySwitch.jav new file mode 100644 index 00000000000..3e97ccdc5ca --- /dev/null +++ b/tests/testData/ast/switch/file/emptySwitch.jav @@ -0,0 +1,10 @@ +public class NonDefault { + public static void main(String[] args) { + + int value = 3; + String valueString = ""; + switch (value) { + } + System.out.println(valueString); + } +} \ No newline at end of file diff --git a/tests/testData/ast/switch/file/emptySwitch.kt b/tests/testData/ast/switch/file/emptySwitch.kt new file mode 100644 index 00000000000..afb01623bfe --- /dev/null +++ b/tests/testData/ast/switch/file/emptySwitch.kt @@ -0,0 +1,14 @@ +public open class NonDefault() { +class object { +public open fun main(args : Array?) : Unit { +var value : Int = 3 +var valueString : String? = "" +when (value) { +else -> { +} +} +System.out?.println(valueString) +} +} +} +fun main(args : Array) = NonDefault.main(args as Array?) \ No newline at end of file diff --git a/tests/testData/ast/switch/file/nondefault.jav b/tests/testData/ast/switch/file/nondefault.jav new file mode 100644 index 00000000000..7734371f59e --- /dev/null +++ b/tests/testData/ast/switch/file/nondefault.jav @@ -0,0 +1,13 @@ +public class NonDefault { + public static void main(String[] args) { + + int value = 3; + String valueString = ""; + switch (value) { + case 1: valueString = "ONE"; break; + case 2: valueString = "TWO"; break; + case 3: valueString = "THREE"; break; + } + System.out.println(valueString); + } +} \ No newline at end of file diff --git a/tests/testData/ast/switch/file/nondefault.kt b/tests/testData/ast/switch/file/nondefault.kt new file mode 100644 index 00000000000..de93f99ed00 --- /dev/null +++ b/tests/testData/ast/switch/file/nondefault.kt @@ -0,0 +1,23 @@ +public open class NonDefault() { +class object { +public open fun main(args : Array?) : Unit { +var value : Int = 3 +var valueString : String? = "" +when (value) { +1 -> { +valueString = "ONE" +} +2 -> { +valueString = "TWO" +} +3 -> { +valueString = "THREE" +} +else -> { +} +} +System.out?.println(valueString) +} +} +} +fun main(args : Array) = NonDefault.main(args as Array?) \ No newline at end of file