From 37ec787d53f3fc89ad5a4493112a827e68e80b1a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 13:49:18 +0400 Subject: [PATCH] ForeachStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- .../jet/j2k/ast/ForeachStatement.java | 25 +++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 2 +- .../jet/j2k/visitors/StatementVisitor.java | 9 ++-- .../jet/j2k/{ast => visitors}/Visitor.java | 3 +- .../jet/j2k/ast/ForeachStatementTest.java | 41 +++++++++++++++++++ 6 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/ForeachStatement.java rename src/org/jetbrains/jet/j2k/{ast => visitors}/Visitor.java (62%) create mode 100644 test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 40d6fbe23a9..cdf9a167dc5 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -208,7 +208,7 @@ public class Converter { return result; } - private static Parameter parameterToParameter(PsiParameter parameter) { + public static Parameter parameterToParameter(PsiParameter parameter) { return new Parameter( new IdentifierImpl(parameter.getName()), // TODO: remove typeToType(parameter.getType()) diff --git a/src/org/jetbrains/jet/j2k/ast/ForeachStatement.java b/src/org/jetbrains/jet/j2k/ast/ForeachStatement.java new file mode 100644 index 00000000000..08f2a457b11 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ForeachStatement.java @@ -0,0 +1,25 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ForeachStatement extends Statement { + private final Parameter myVariable; + private final Expression myExpression; + private final Statement myStatement; + + public ForeachStatement(Parameter variable, Expression expression, Statement statement) { + myVariable = variable; + myExpression = expression; + myStatement = statement; + } + + @NotNull + @Override + public String toKotlin() { + return "for" + SPACE + "(" + myVariable.toKotlin() + SPACE + IN + SPACE + myExpression.toKotlin() + ")" + N + + myStatement.toKotlin(); + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index c363f7d7e6b..ea87fdd0de3 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -123,7 +123,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { public void visitExpressionList(PsiExpressionList list) { super.visitExpressionList(list); myResult = - new ExpressionList(expressionsToExpressionList(list.getExpressions())); + 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 bf52b08a2c0..0919a3696b9 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -9,9 +9,7 @@ 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; +import static org.jetbrains.jet.j2k.Converter.*; /** * @author ignatov @@ -101,6 +99,11 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitForeachStatement(PsiForeachStatement statement) { super.visitForeachStatement(statement); + myResult = new ForeachStatement( + parameterToParameter(statement.getIterationParameter()), + expressionToExpression(statement.getIteratedValue()), + statementToStatement(statement.getBody()) + ); } @Override diff --git a/src/org/jetbrains/jet/j2k/ast/Visitor.java b/src/org/jetbrains/jet/j2k/visitors/Visitor.java similarity index 62% rename from src/org/jetbrains/jet/j2k/ast/Visitor.java rename to src/org/jetbrains/jet/j2k/visitors/Visitor.java index fa1a2126af7..5888c1a4ca8 100644 --- a/src/org/jetbrains/jet/j2k/ast/Visitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/Visitor.java @@ -1,6 +1,7 @@ -package org.jetbrains.jet.j2k.ast; +package org.jetbrains.jet.j2k.visitors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.ast.Element; /** * @author ignatov diff --git a/test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java new file mode 100644 index 00000000000..d283c806c11 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java @@ -0,0 +1,41 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ForeachStatementTest extends JetTestCaseBase { + public void testEnhancedForWithEmptyBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("for (Node n : list) {}"), + "for (n : Node? in list)\n{\n" + "}" + ); + } + + public void testEnhancedForWithBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("for (Node n : list) {int i = 1; i++;}"), + "for (n : Node? in list)\n" + + "{\n" + + "var i : Int = 1\n" + + "(i++)\n" + + "}" + ); + } + + public void testEnhancedForWithReturn() throws Exception { + Assert.assertEquals( + statementToKotlin("for (Node n : list) return n;"), + "for (n : Node? in list)\nreturn n" + ); + } + + public void testEnhancedForWithExpression() throws Exception { + Assert.assertEquals( + statementToKotlin("for (Node n : list) i++;"), + "for (n : Node? in list)\n(i++)" + ); + } +}