KT-539 Switch support
This commit is contained in:
@@ -388,6 +388,13 @@ public class Converter {
|
|||||||
return result;
|
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
|
@NotNull
|
||||||
public static Statement statementToStatement(@Nullable PsiStatement s) {
|
public static Statement statementToStatement(@Nullable PsiStatement s) {
|
||||||
if (s == null) return Statement.EMPTY_STATEMENT;
|
if (s == null) return Statement.EMPTY_STATEMENT;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.jetbrains.jet.j2k.ast.*;
|
import org.jetbrains.jet.j2k.ast.*;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -201,27 +202,62 @@ public class StatementVisitor extends ElementVisitor {
|
|||||||
super.visitSwitchStatement(statement);
|
super.visitSwitchStatement(statement);
|
||||||
myResult = new SwitchContainer(
|
myResult = new SwitchContainer(
|
||||||
expressionToExpression(statement.getExpression()),
|
expressionToExpression(statement.getExpression()),
|
||||||
listToCases(splitToCases(statement.getBody()))
|
switchBodyToCases(statement.getBody())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@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<CaseContainer> result = new LinkedList<CaseContainer>();
|
||||||
List<Statement> pendingLabels = new LinkedList<Statement>();
|
List<Statement> pendingLabels = new LinkedList<Statement>();
|
||||||
|
int i = 0;
|
||||||
for (List<PsiStatement> ls : cases) {
|
for (List<PsiStatement> ls : cases) {
|
||||||
assert ls.size() > 0;
|
assert ls.size() > 0;
|
||||||
PsiStatement label = ls.get(0);
|
PsiStatement label = ls.get(0);
|
||||||
assert label instanceof PsiSwitchLabelStatement;
|
assert label instanceof PsiSwitchLabelStatement;
|
||||||
|
|
||||||
|
assert allSwitchStatements.get(i) == label : "not a right index";
|
||||||
|
|
||||||
if (ls.size() > 1) {
|
if (ls.size() > 1) {
|
||||||
pendingLabels.add(statementToStatement(label));
|
pendingLabels.add(statementToStatement(label));
|
||||||
result.add(new CaseContainer(pendingLabels,
|
List<PsiStatement> slice = ls.subList(1, ls.size());
|
||||||
statementsToStatementList(ls.subList(1, ls.size()).toArray(new PsiStatement[ls.size() - 1]))
|
|
||||||
));
|
if (!containsBreak(slice)) {
|
||||||
pendingLabels = new LinkedList<Statement>();
|
List<Statement> statements = statementsToStatementList(slice);
|
||||||
}
|
statements.addAll(
|
||||||
else // ls.size() == 1
|
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));
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase {
|
|||||||
|
|
||||||
public static Test suite() {
|
public static Test suite() {
|
||||||
TestSuite suite = new TestSuite();
|
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
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Test createTest(@NotNull String dataPath, @NotNull String name) {
|
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