KT-539 Switch support
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user