From 207b13c64d2d76823bf7194912665f753fdb8ae6 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 14:14:25 +0400 Subject: [PATCH] TryStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 11 +- src/org/jetbrains/jet/j2k/ast/Block.java | 9 +- .../jetbrains/jet/j2k/ast/CatchStatement.java | 22 ++++ .../jetbrains/jet/j2k/ast/TryStatement.java | 30 +++++ .../jet/j2k/visitors/StatementVisitor.java | 14 +++ .../jet/j2k/ast/TryStatementTest.java | 111 ++++++++++++++++++ 6 files changed, 190 insertions(+), 7 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/CatchStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/TryStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/TryStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index cdf9a167dc5..684a29a8d27 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -85,7 +85,7 @@ public class Converter { private static Function methodToFunction(PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); final Type type = typeToType(method.getReturnType()); - final Block body = bodyToBlock(method.getBody(), notEmpty); + final Block body = blockToBlock(method.getBody(), notEmpty); final Element params = elementToElement(method.getParameterList()); if (method.isConstructor()) @@ -104,10 +104,10 @@ public class Converter { } @NotNull - private static Block bodyToBlock(PsiCodeBlock body, boolean notEmpty) { - if (body == null) - return new Block(new LinkedList(), false); - return new Block(statementsToStatementList(body.getStatements()), notEmpty); + public static Block blockToBlock(PsiCodeBlock block, boolean notEmpty) { + if (block == null) + return Block.EMPTY_BLOCK; + return new Block(statementsToStatementList(block.getStatements()), notEmpty); } @NotNull @@ -208,6 +208,7 @@ public class Converter { return result; } + @NotNull public static Parameter parameterToParameter(PsiParameter parameter) { return new Parameter( new IdentifierImpl(parameter.getName()), // TODO: remove diff --git a/src/org/jetbrains/jet/j2k/ast/Block.java b/src/org/jetbrains/jet/j2k/ast/Block.java index 8a50bd3b94e..9166a3586d3 100644 --- a/src/org/jetbrains/jet/j2k/ast/Block.java +++ b/src/org/jetbrains/jet/j2k/ast/Block.java @@ -3,15 +3,20 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.LinkedList; import java.util.List; /** * @author ignatov */ public class Block extends Statement { - private List myStatements; + public final static Block EMPTY_BLOCK = new Block(); + private List myStatements = new LinkedList(); private boolean myNotEmpty = false; + private Block() { + } + public Block(List statements) { myStatements = statements; } @@ -21,7 +26,7 @@ public class Block extends Statement { myNotEmpty = notEmpty; } - private boolean isEmpty() { + public boolean isEmpty() { return !myNotEmpty && myStatements.size() == 0; } diff --git a/src/org/jetbrains/jet/j2k/ast/CatchStatement.java b/src/org/jetbrains/jet/j2k/ast/CatchStatement.java new file mode 100644 index 00000000000..7db33c91163 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/CatchStatement.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class CatchStatement extends Statement { + private final Parameter myVariable; + private final Block myBlock; + + public CatchStatement(Parameter variable, Block block) { + myVariable = variable; + myBlock = block; + } + + @NotNull + @Override + public String toKotlin() { + return "catch" + SPACE + "(" + myVariable.toKotlin() + ")" + SPACE + myBlock.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/TryStatement.java b/src/org/jetbrains/jet/j2k/ast/TryStatement.java new file mode 100644 index 00000000000..d9ae141327e --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/TryStatement.java @@ -0,0 +1,30 @@ +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 TryStatement extends Statement { + private final Block myBlock; + private final List myCatches; + private final Block myFinallyBlock; + + public TryStatement(Block block, List catches, Block finallyBlock) { + myBlock = block; + myCatches = catches; + myFinallyBlock = finallyBlock; + } + + @NotNull + @Override + public String toKotlin() { + return "try" + N + + myBlock.toKotlin() + N + + AstUtil.joinNodes(myCatches, N) + N + + (myFinallyBlock.isEmpty() ? EMPTY : "finally" + N + myFinallyBlock.toKotlin()); + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 0919a3696b9..818bdfafe0c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -159,6 +159,20 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitTryStatement(PsiTryStatement statement) { super.visitTryStatement(statement); + + List catches = new LinkedList(); + for (int i = 0; i < statement.getCatchBlocks().length; i++) { + catches.add(new CatchStatement( + parameterToParameter(statement.getCatchBlockParameters()[i]), + blockToBlock(statement.getCatchBlocks()[i], true) + )); + } + + myResult = new TryStatement( + blockToBlock(statement.getTryBlock(), true), + catches, + blockToBlock(statement.getFinallyBlock(), true) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/TryStatementTest.java b/test/org/jetbrains/jet/j2k/ast/TryStatementTest.java new file mode 100644 index 00000000000..e0cea4cdb49 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/TryStatementTest.java @@ -0,0 +1,111 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class TryStatementTest extends JetTestCaseBase { + public void testEmptyTryWithTwoCatchesWithoutFinally() throws Exception { + Assert.assertEquals( + statementToKotlin( + "try {" + + "} catch (Exception e) {" + + " println(1);" + + "} catch (IOException e) {" + + " println(0);" + + "}"), + "try\n" + + "{\n" + + "}\n" + + "catch (e : Exception?) {\n" + + "println(1)\n" + + "}\n" + + "catch (e : IOException?) {\n" + + "println(0)\n" + + "}" + ); + } + + public void testEmptyTryWithTwoCatchesWithEmptyFinally() throws Exception { + Assert.assertEquals( + statementToKotlin( + "try {" + + "} catch (Exception e) {" + + " println(1);" + + "} catch (IOException e) {" + + " println(0);" + + "} finally {}"), + "try\n" + + "{\n" + + "}\n" + + "catch (e : Exception?) {\n" + + "println(1)\n" + + "}\n" + + "catch (e : IOException?) {\n" + + "println(0)\n" + + "}\n" + + "finally\n" + + "{\n" + + "}" + ); + } + + public void testEmptyTryWithTwoCatchesWithFinally() throws Exception { + Assert.assertEquals( + statementToKotlin( + "try {" + + "} catch (Exception e) {" + + " println(1);" + + "} catch (IOException e) {" + + " println(0);" + + "} finally {" + + " println(3);" + + "}"), + "try\n" + + "{\n" + + "}\n" + + "catch (e : Exception?) {\n" + + "println(1)\n" + + "}\n" + + "catch (e : IOException?) {\n" + + "println(0)\n" + + "}\n" + + "finally\n" + + "{\n" + + "println(3)\n" + + "}" + ); + } + + public void testCommonCaseForTryStatement() throws Exception { + Assert.assertEquals( + statementToKotlin( + "try {" + + " callMethod(params);" + + "} catch (Exception e) {" + + " println(1);" + + "} catch (IOException e) {" + + " println(0);" + + "} finally {" + + " println(3);" + + "}"), + "try\n" + + "{\n" + + "callMethod(params)\n" + + "}\n" + + "catch (e : Exception?) {\n" + + "println(1)\n" + + "}\n" + + "catch (e : IOException?) {\n" + + "println(0)\n" + + "}\n" + + "finally\n" + + "{\n" + + "println(3)\n" + + "}" + ); + } + +}