From 1287379398c22ae8579f130f3f2b05487d342501 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 7 Dec 2011 15:45:00 +0400 Subject: [PATCH] first implementation for switch conversion added --- .../jetbrains/jet/j2k/ast/CaseContainer.java | 29 +++++++++++ .../j2k/ast/DefaultSwitchLabelStatement.java | 14 +++++ .../jet/j2k/ast/SwitchContainer.java | 27 ++++++++++ .../jet/j2k/ast/SwitchLabelStatement.java | 20 ++++++++ .../jet/j2k/visitors/StatementVisitor.java | 48 +++++++++++++++++ testData/ast/switch/file/kt-539.jav | 25 +++++++++ testData/ast/switch/file/kt-539.kt | 51 +++++++++++++++++++ 7 files changed, 214 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/CaseContainer.java create mode 100644 src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/SwitchContainer.java create mode 100644 src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java create mode 100644 testData/ast/switch/file/kt-539.jav create mode 100644 testData/ast/switch/file/kt-539.kt diff --git a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java new file mode 100644 index 00000000000..9d1bbfddb16 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java @@ -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 statements) { + myCaseStatement = caseStatement; + List newStatements = new LinkedList(); + 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(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java b/src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java new file mode 100644 index 00000000000..a148197da77 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java @@ -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"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java b/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java new file mode 100644 index 00000000000..3df81ce44cd --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java @@ -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 myCaseContainers; + + public SwitchContainer(final Expression expression, final List caseContainers) { + myExpression = expression; + myCaseContainers = caseContainers; + } + + @NotNull + @Override + public String toKotlin() { + return "when" + SPACE + "(" + myExpression.toKotlin() + ")" + SPACE + "{" + N + + AstUtil.joinNodes(myCaseContainers, N) + N + + "}"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java b/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java new file mode 100644 index 00000000000..d0ccb83acad --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java @@ -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(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index e73cf6c7314..9f29877efe4 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -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 caseContainers = listToCases(splitToCases(statement.getBody())); + myResult = new SwitchContainer( + expressionToExpression(statement.getExpression()), + caseContainers + ); + } + + @NotNull + private static List listToCases(@NotNull final List> cases) { + List result = new LinkedList(); + for (List 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.emptyList() + )); + } + return result; + } + + @NotNull + private static List> splitToCases(@Nullable final PsiCodeBlock body) { + List> cases = new LinkedList>(); + List currentCaseStatements = new LinkedList(); + 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(); + } + } + currentCaseStatements.add(s); + } + cases.add(currentCaseStatements); + } + return cases; } @Override diff --git a/testData/ast/switch/file/kt-539.jav b/testData/ast/switch/file/kt-539.jav new file mode 100644 index 00000000000..890eaa836e2 --- /dev/null +++ b/testData/ast/switch/file/kt-539.jav @@ -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); + } +} \ No newline at end of file diff --git a/testData/ast/switch/file/kt-539.kt b/testData/ast/switch/file/kt-539.kt new file mode 100644 index 00000000000..b716e66dd3d --- /dev/null +++ b/testData/ast/switch/file/kt-539.kt @@ -0,0 +1,51 @@ +namespace switch_demo +public open class SwitchDemo() { +class object { +open public fun main(args : Array?) : 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) +} +} +} \ No newline at end of file