KT-539 Switch support

This commit is contained in:
Sergey Ignatov
2011-12-07 17:44:32 +04:00
parent 1c374e3382
commit 374ebaafc8
7 changed files with 171 additions and 9 deletions
+7
View File
@@ -388,6 +388,13 @@ public class Converter {
return result;
}
@NotNull
public static List<Statement> statementsToStatementList(@NotNull List<PsiStatement> statements) {
List<Statement> result = new LinkedList<Statement>();
for (PsiStatement t : statements) result.add(statementToStatement(t));
return result;
}
@NotNull
public static Statement statementToStatement(@Nullable PsiStatement s) {
if (s == null) return Statement.EMPTY_STATEMENT;
@@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.j2k.ast.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
@@ -201,27 +202,62 @@ public class StatementVisitor extends ElementVisitor {
super.visitSwitchStatement(statement);
myResult = new SwitchContainer(
expressionToExpression(statement.getExpression()),
listToCases(splitToCases(statement.getBody()))
switchBodyToCases(statement.getBody())
);
}
@NotNull
private static List<CaseContainer> listToCases(@NotNull final List<List<PsiStatement>> cases) {
private static List<CaseContainer> switchBodyToCases(@Nullable final PsiCodeBlock body) {
final List<List<PsiStatement>> cases = splitToCases(body);
final List<PsiStatement> allSwitchStatements = body != null ? Arrays.asList(body.getStatements()) : Collections.<PsiStatement>emptyList();
List<CaseContainer> result = new LinkedList<CaseContainer>();
List<Statement> pendingLabels = new LinkedList<Statement>();
int i = 0;
for (List<PsiStatement> ls : cases) {
assert ls.size() > 0;
PsiStatement label = ls.get(0);
assert label instanceof PsiSwitchLabelStatement;
assert allSwitchStatements.get(i) == label : "not a right index";
if (ls.size() > 1) {
pendingLabels.add(statementToStatement(label));
result.add(new CaseContainer(pendingLabels,
statementsToStatementList(ls.subList(1, ls.size()).toArray(new PsiStatement[ls.size() - 1]))
));
pendingLabels = new LinkedList<Statement>();
}
else // ls.size() == 1
List<PsiStatement> slice = ls.subList(1, ls.size());
if (!containsBreak(slice)) {
List<Statement> statements = statementsToStatementList(slice);
statements.addAll(
statementsToStatementList(getAllToNextBreak(allSwitchStatements, i + ls.size()))
);
result.add(new CaseContainer(pendingLabels, statements));
pendingLabels = new LinkedList<Statement>();
} else {
result.add(new CaseContainer(pendingLabels, statementsToStatementList(slice)));
pendingLabels = new LinkedList<Statement>();
}
} else // ls.size() == 1
pendingLabels.add(statementToStatement(label));
i += ls.size();
}
return result;
}
private static boolean containsBreak(@NotNull final List<PsiStatement> slice) {
for (PsiStatement s : slice)
if (s instanceof PsiBreakStatement)
return true;
return false;
}
private static List<PsiStatement> getAllToNextBreak(@NotNull final List<PsiStatement> allStatements, final int start) {
List<PsiStatement> result = new LinkedList<PsiStatement>();
for (int i = start; i < allStatements.size(); i++) {
PsiStatement s = allStatements.get(i);
if (s instanceof PsiBreakStatement)
return result;
if (!(s instanceof PsiSwitchLabelStatement))
result.add(s);
}
return result;
}
@@ -84,7 +84,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase {
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast", true, new TestCaseBuilder.NamedTestFactory() {
suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast/switch", true, new TestCaseBuilder.NamedTestFactory() {
@NotNull
@Override
public Test createTest(@NotNull String dataPath, @NotNull String name) {
@@ -0,0 +1,32 @@
package demo;
public class SwitchDemo {
public static void print(Object o) {
System.out.println(o);
}
public static void test(int i) {
String monthString = "<empty>";
switch (i) {
case 1: print(1);
case 2: print(2);
case 3: print(3);
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;
default: monthString = "Invalid month"; break;
}
System.out.println(monthString);
}
public static void main(String[] args) {
for (int i = 1; i <=12 ; i++)
test(i);
}
}
@@ -0,0 +1,87 @@
namespace demo
public open class SwitchDemo() {
class object {
open public fun print(o : Any?) : Unit {
System.out?.println(o)
}
open public fun test(i : Int) : Unit {
var monthString : String? = "<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 => {
monthString = "Invalid month"
}
}
System.out?.println(monthString)
}
open public fun main(args : Array<String?>?) : Unit {
for (i in 1..12) test(i)
}
}
}