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.tree.IElementType;
|
||||||
import com.intellij.psi.util.PsiUtil;
|
import com.intellij.psi.util.PsiUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
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;
|
||||||
|
|
||||||
@@ -190,11 +192,57 @@ public class StatementVisitor extends ElementVisitor {
|
|||||||
@Override
|
@Override
|
||||||
public void visitSwitchLabelStatement(PsiSwitchLabelStatement statement) {
|
public void visitSwitchLabelStatement(PsiSwitchLabelStatement statement) {
|
||||||
super.visitSwitchLabelStatement(statement);
|
super.visitSwitchLabelStatement(statement);
|
||||||
|
myResult = statement.isDefaultCase() ?
|
||||||
|
new DefaultSwitchLabelStatement() :
|
||||||
|
new SwitchLabelStatement(expressionToExpression(statement.getCaseValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitSwitchStatement(PsiSwitchStatement statement) {
|
public void visitSwitchStatement(PsiSwitchStatement statement) {
|
||||||
super.visitSwitchStatement(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
|
@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