first implementation for switch conversion added
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user