diff --git a/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java b/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java new file mode 100644 index 00000000000..b7cfb59e5bf --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java @@ -0,0 +1,23 @@ +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 ExpressionListStatement extends Expression { + private List myExpressions; + + public ExpressionListStatement(List expressions) { + myExpressions = expressions; + } + + @NotNull + @Override + public String toKotlin() { + return AstUtil.joinNodes(myExpressions, N); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ff965a000a2..c363f7d7e6b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -6,8 +6,7 @@ import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; -import static org.jetbrains.jet.j2k.Converter.elementToElement; -import static org.jetbrains.jet.j2k.Converter.expressionToExpression; +import static org.jetbrains.jet.j2k.Converter.*; /** * @author ignatov @@ -115,11 +114,6 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { super.visitConditionalExpression(expression); } - @Override - public void visitExpressionListStatement(PsiExpressionListStatement statement) { - super.visitExpressionListStatement(statement); - } - @Override public void visitExpressionStatement(PsiExpressionStatement statement) { super.visitExpressionStatement(statement); @@ -128,6 +122,8 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitExpressionList(PsiExpressionList list) { super.visitExpressionList(list); + myResult = + new ExpressionList(expressionsToExpressionList(list.getExpressions())); } @Override diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 1fc918f746b..bf52b08a2c0 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -5,7 +5,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + import static org.jetbrains.jet.j2k.Converter.expressionToExpression; +import static org.jetbrains.jet.j2k.Converter.expressionsToExpressionList; import static org.jetbrains.jet.j2k.Converter.statementToStatement; /** @@ -74,11 +79,23 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitExpressionListStatement(PsiExpressionListStatement statement) { super.visitExpressionListStatement(statement); + myResult = + new ExpressionListStatement(expressionsToExpressionList(statement.getExpressionList().getExpressions())); + } @Override public void visitForStatement(PsiForStatement statement) { super.visitForStatement(statement); + + List forStatements = new LinkedList(); + forStatements.add(statementToStatement(statement.getInitialization())); + forStatements.add(new WhileStatement( + expressionToExpression(statement.getCondition()), + new Block( + Arrays.asList(statementToStatement(statement.getBody()), + new Block(Arrays.asList(statementToStatement(statement.getUpdate()))))))); + myResult = new Block(forStatements); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/ForTest.java b/test/org/jetbrains/jet/j2k/ast/ForTest.java new file mode 100644 index 00000000000..0ff18e98229 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ForTest.java @@ -0,0 +1,115 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ForTest extends JetTestCaseBase { + public void testCommonCaseForTest() throws Exception { + Assert.assertEquals( + statementToKotlin("for (init(); condition(); update()) body();"), + "{\n" + + "init()\n" + + "while (condition())\n" + + "{\n" + + "body()\n" + + "{\n" + + "update()\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithEmptyBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; j++, i++) {}"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "{\n" + + "}\n" + + "{\n" + + "(j++)\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; i++) {int i = 1; i++;}"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "{\n" + + "var i : Int = 1\n" + + "(i++)\n" + + "}\n" + + "{\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithBlockAndDoubleUpdate() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; j++, i++) {int i = 1; i++;}"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "{\n" + + "var i : Int = 1\n" + + "(i++)\n" + + "}\n" + + "{\n" + + "(j++)\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithReturn() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; j++, i++) return i;"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "return i\n" + + "{\n" + + "(j++)\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithExpression() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; i++) t++;"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "(t++)\n" + + "{\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } +}