first implementation for switch conversion added

This commit is contained in:
Sergey Ignatov
2011-12-07 15:45:00 +04:00
parent 0c358a9e94
commit 1287379398
7 changed files with 214 additions and 0 deletions
@@ -0,0 +1,29 @@
package org.jetbrains.jet.j2k.ast;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedList;
import java.util.List;
/**
* @author ignatov
*/
public class CaseContainer extends Statement {
private Statement myCaseStatement;
private Block myBlock;
public CaseContainer(final Statement caseStatement, final List<Statement> statements) {
myCaseStatement = caseStatement;
List<Statement> newStatements = new LinkedList<Statement>();
for (Statement s : statements)
if (s.getKind() != Kind.BREAK && s.getKind() != Kind.CONTINUE )
newStatements.add(s);
myBlock = new Block(newStatements);
}
@NotNull
@Override
public String toKotlin() {
return myCaseStatement.toKotlin() + SPACE + "=>" + SPACE + myBlock.toKotlin();
}
}
@@ -0,0 +1,14 @@
package org.jetbrains.jet.j2k.ast;
import org.jetbrains.annotations.NotNull;
/**
* @author ignatov
*/
public class DefaultSwitchLabelStatement extends Statement {
@NotNull
@Override
public String toKotlin() {
return "else";
}
}
@@ -0,0 +1,27 @@
package org.jetbrains.jet.j2k.ast;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.j2k.util.AstUtil;
import java.util.List;
/**
* @author ignatov
*/
public class SwitchContainer extends Statement {
private Expression myExpression;
private List<CaseContainer> myCaseContainers;
public SwitchContainer(final Expression expression, final List<CaseContainer> caseContainers) {
myExpression = expression;
myCaseContainers = caseContainers;
}
@NotNull
@Override
public String toKotlin() {
return "when" + SPACE + "(" + myExpression.toKotlin() + ")" + SPACE + "{" + N +
AstUtil.joinNodes(myCaseContainers, N) + N +
"}";
}
}
@@ -0,0 +1,20 @@
package org.jetbrains.jet.j2k.ast;
import org.jetbrains.annotations.NotNull;
/**
* @author ignatov
*/
public class SwitchLabelStatement extends Statement {
private Expression myExpression;
public SwitchLabelStatement(final Expression expression) {
myExpression = expression;
}
@NotNull
@Override
public String toKotlin() {
return myExpression.toKotlin();
}
}
@@ -5,9 +5,11 @@ import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
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;
@@ -190,11 +192,57 @@ public class StatementVisitor extends ElementVisitor {
@Override
public void visitSwitchLabelStatement(PsiSwitchLabelStatement statement) {
super.visitSwitchLabelStatement(statement);
myResult = statement.isDefaultCase() ?
new DefaultSwitchLabelStatement() :
new SwitchLabelStatement(expressionToExpression(statement.getCaseValue()));
}
@Override
public void visitSwitchStatement(PsiSwitchStatement statement) {
super.visitSwitchStatement(statement);
List<CaseContainer> caseContainers = listToCases(splitToCases(statement.getBody()));
myResult = new SwitchContainer(
expressionToExpression(statement.getExpression()),
caseContainers
);
}
@NotNull
private static List<CaseContainer> listToCases(@NotNull final List<List<PsiStatement>> cases) {
List<CaseContainer> result = new LinkedList<CaseContainer>();
for (List<PsiStatement> ls : cases) {
assert ls.size() > 0;
PsiStatement label = ls.get(0);
assert label instanceof PsiSwitchLabelStatement;
result.add(new CaseContainer(statementToStatement(label),
ls.size() > 1 ?
statementsToStatementList(ls.subList(1, ls.size()).toArray(new PsiStatement[ls.size() - 1])) :
Collections.<Statement>emptyList()
));
}
return result;
}
@NotNull
private static List<List<PsiStatement>> splitToCases(@Nullable final PsiCodeBlock body) {
List<List<PsiStatement>> cases = new LinkedList<List<PsiStatement>>();
List<PsiStatement> currentCaseStatements = new LinkedList<PsiStatement>();
boolean isFirst = true;
if (body != null) {
for (PsiStatement s : body.getStatements()) {
if (s instanceof PsiSwitchLabelStatement) {
if (isFirst)
isFirst = false;
else {
cases.add(currentCaseStatements);
currentCaseStatements = new LinkedList<PsiStatement>();
}
}
currentCaseStatements.add(s);
}
cases.add(currentCaseStatements);
}
return cases;
}
@Override
+25
View File
@@ -0,0 +1,25 @@
package switch_demo;
public class SwitchDemo {
public static void main(String[] args) {
int month = 8;
String monthString;
switch (month) {
case 1: monthString = "January"; break;
case 2: monthString = "February"; break;
case 3: monthString = "March"; break;
case 4: monthString = "April"; break;
case 5: monthString = "May"; break;
case 6: monthString = "June"; break;
case 7: monthString = "July"; break;
case 8: monthString = "August"; break;
case 9: monthString = "September"; break;
case 10: monthString = "October"; break;
case 11: monthString = "November"; break;
case 12: monthString = "December"; break;
default: monthString = "Invalid month"; break;
}
System.out.println(monthString);
}
}
+51
View File
@@ -0,0 +1,51 @@
namespace switch_demo
public open class SwitchDemo() {
class object {
open public fun main(args : Array<String?>?) : Unit {
var month : Int = 8
var monthString : String?
when (month) {
1 => {
monthString = "January"
}
2 => {
monthString = "February"
}
3 => {
monthString = "March"
}
4 => {
monthString = "April"
}
5 => {
monthString = "May"
}
6 => {
monthString = "June"
}
7 => {
monthString = "July"
}
8 => {
monthString = "August"
}
9 => {
monthString = "September"
}
10 => {
monthString = "October"
}
11 => {
monthString = "November"
}
12 => {
monthString = "December"
}
else => {
monthString = "Invalid month"
}
}
System.out?.println(monthString)
}
}
}