From f6d367b7d0236eb9f35fd0b8f759243a058c18a9 Mon Sep 17 00:00:00 2001 From: Hozum Date: Fri, 22 Mar 2013 01:24:44 +0900 Subject: [PATCH] Fixed switch statement --- src/org/jetbrains/jet/j2k/ast/Statements.kt | 2 +- .../jet/j2k/visitors/StatementVisitor.kt | 44 +++++++++++-------- .../testData/ast/switch/file/emptySwitch.jav | 10 +++++ tests/testData/ast/switch/file/emptySwitch.kt | 14 ++++++ tests/testData/ast/switch/file/nondefault.jav | 13 ++++++ tests/testData/ast/switch/file/nondefault.kt | 23 ++++++++++ 6 files changed, 86 insertions(+), 20 deletions(-) create mode 100644 tests/testData/ast/switch/file/emptySwitch.jav create mode 100644 tests/testData/ast/switch/file/emptySwitch.kt create mode 100644 tests/testData/ast/switch/file/nondefault.jav create mode 100644 tests/testData/ast/switch/file/nondefault.kt 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