From ba856a974bb6f0b3f78b1835765fbb5f74bf2a91 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 12:17:54 +0400 Subject: [PATCH] IfStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 2 + src/org/jetbrains/jet/j2k/ast/Block.java | 2 +- .../jetbrains/jet/j2k/ast/EmptyStatement.java | 14 ----- .../jetbrains/jet/j2k/ast/IfStatement.java | 28 +++++++++ src/org/jetbrains/jet/j2k/ast/Statement.java | 14 +++++ .../jet/j2k/visitors/StatementVisitor.java | 11 +++- test/org/jetbrains/jet/j2k/ast/EnumTest.java | 4 +- .../jet/j2k/ast/IfStatementTest.java | 57 +++++++++++++++++++ 8 files changed, 113 insertions(+), 19 deletions(-) delete mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/IfStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/IfStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index defa3ad6c35..40d6fbe23a9 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -121,6 +121,8 @@ public class Converter { @NotNull public static Statement statementToStatement(PsiStatement t) { + if (t == null) + return Statement.EMPTY_STATEMENT; final StatementVisitor statementVisitor = new StatementVisitor(); t.accept(statementVisitor); System.out.println(t.getClass()); diff --git a/src/org/jetbrains/jet/j2k/ast/Block.java b/src/org/jetbrains/jet/j2k/ast/Block.java index 5f164676a9c..8a50bd3b94e 100644 --- a/src/org/jetbrains/jet/j2k/ast/Block.java +++ b/src/org/jetbrains/jet/j2k/ast/Block.java @@ -10,7 +10,7 @@ import java.util.List; */ public class Block extends Statement { private List myStatements; - private boolean myNotEmpty; + private boolean myNotEmpty = false; public Block(List statements) { myStatements = statements; diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyStatement.java b/src/org/jetbrains/jet/j2k/ast/EmptyStatement.java deleted file mode 100644 index 970a9d02539..00000000000 --- a/src/org/jetbrains/jet/j2k/ast/EmptyStatement.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import org.jetbrains.annotations.NotNull; - -/** - * @author ignatov - */ -public class EmptyStatement extends Statement { - @NotNull - @Override - public String toKotlin() { - return EMPTY; - } -} diff --git a/src/org/jetbrains/jet/j2k/ast/IfStatement.java b/src/org/jetbrains/jet/j2k/ast/IfStatement.java new file mode 100644 index 00000000000..5fcf3db38d4 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/IfStatement.java @@ -0,0 +1,28 @@ +package org.jetbrains.jet.j2k.ast; + +/** + * @author ignatov + */ +public class IfStatement extends Statement { + private final Expression myCondition; + private final Statement myThenStatement; + private final Statement myElseStatement; + + public IfStatement(Expression condition, Statement thenStatement, Statement elseStatement) { + myCondition = condition; + myThenStatement = thenStatement; + myElseStatement = elseStatement; + } + + @Override + public String toKotlin() { + String result = "if" + SPACE + "(" + myCondition.toKotlin() + ")" + N + myThenStatement.toKotlin() + N; + + if (myElseStatement != Statement.EMPTY_STATEMENT) + return result + + "else" + N + + myElseStatement.toKotlin(); + + return result; + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Statement.java b/src/org/jetbrains/jet/j2k/ast/Statement.java index 1f6c667eb1b..c173147f8ae 100644 --- a/src/org/jetbrains/jet/j2k/ast/Statement.java +++ b/src/org/jetbrains/jet/j2k/ast/Statement.java @@ -1,7 +1,21 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; + /** * @author ignatov */ public abstract class Statement extends Element { + public static Statement EMPTY_STATEMENT = new EmptyStatement(); + + /** + * @author ignatov + */ + private static class EmptyStatement extends Statement { + @NotNull + @Override + public String toKotlin() { + return EMPTY; + } + } } diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 96c3a3206c1..7ab7a9e70ff 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -9,7 +9,7 @@ import org.jetbrains.jet.j2k.ast.*; * @author ignatov */ public class StatementVisitor extends ElementVisitor implements Visitor { - private Statement myResult = new EmptyStatement(); + private Statement myResult = Statement.EMPTY_STATEMENT; @NotNull public Statement getStatement() { @@ -24,6 +24,10 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitBlockStatement(PsiBlockStatement statement) { super.visitBlockStatement(statement); + myResult = new Block( + Converter.statementsToStatementList(statement.getCodeBlock().getStatements()), + true + ); } @Override @@ -83,6 +87,11 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitIfStatement(PsiIfStatement statement) { super.visitIfStatement(statement); + myResult = new IfStatement( + Converter.expressionToExpression(statement.getCondition()), + Converter.statementToStatement(statement.getThenBranch()), + Converter.statementToStatement(statement.getElseBranch()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index bf17217ee23..ed53280a28f 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -26,11 +26,9 @@ public class EnumTest extends JetTestCaseBase { ); } - // public void testOverrideToString() throws Exception { Assert.assertEquals( classToKotlin( - "enum Color {" + " WHITE, BLACK, RED, YELLOW, BLUE;" + "@Override String toString() {" + @@ -109,4 +107,4 @@ public class EnumTest extends JetTestCaseBase { // "" // ); // } - } +} diff --git a/test/org/jetbrains/jet/j2k/ast/IfStatementTest.java b/test/org/jetbrains/jet/j2k/ast/IfStatementTest.java new file mode 100644 index 00000000000..7f08d3d871a --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/IfStatementTest.java @@ -0,0 +1,57 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class IfStatementTest extends JetTestCaseBase { + public void testIfStatementWithOneLineBlocks() throws Exception { + Assert.assertEquals( + statementToKotlin("if (true) return 1; else return 0;"), + "if (true)\n" + + "return 1\n" + + "else\n" + + "return 0" + ); + } + + public void testIfStatementWithMultilineBlocks() throws Exception { + Assert.assertEquals( + statementToKotlin("if (1 > 0) {int n = 1; return n;} else {return 0;}"), + "if ((1 > 0))\n" + + "{\n" + + "var n : Int = 1\n" + + "return n\n" + + "}\n" + + "else\n" + + "{\n" + + "return 0\n" + + "}" + ); + } + + public void testIfStatementWithoutElse() throws Exception { + Assert.assertEquals( + statementToKotlin("if (1 > 0) {int n = 1; return n;}"), + "if ((1 > 0))\n" + + "{\n" + + "var n : Int = 1\n" + + "return n\n" + + "}" + ); + } + + public void testIfStatementWithEmptyBlocks() throws Exception { + Assert.assertEquals( + statementToKotlin("if (1 > 0) {} else {}"), + "if ((1 > 0))\n" + + "{\n" + + "}\n" + + "else\n" + + "{\n" + + "}" + ); + } +}