diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-08-06 10:22:53 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-08-06 10:22:53 +0100 |
| commit | f66bb6c1a7c723643a11b1b4c1af11cec3e94d3a (patch) | |
| tree | b963c19fc9db54dfdec99e2b9310141477b75424 | |
| parent | a863feceff25342d86b9efe5312aec1d7af6ee4e (diff) | |
Ensure that try statements create new block
3 files changed, 17 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java index 6e9444c..6a8bf3c 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java @@ -155,7 +155,7 @@ class JavaStatementReader { List<CatchClause> javaCatchClauses = statement.catchClauses(); List<ExceptionHandlerNode> catchClauses = eagerMap(javaCatchClauses, this::readCatchClause); List<StatementNode> finallyBody = statement.getFinally() == null ? list() : readBody(statement.getFinally()); - if (catchClauses.isEmpty() && finallyBody.isEmpty()) { + if (catchClauses.isEmpty() && finallyBody.isEmpty() && !resourceDeclarations.isEmpty()) { return body; } else { return list(tryStatement(body, catchClauses, finallyBody)); diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java index fdcfce6..73745b2 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java @@ -20,6 +20,7 @@ import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStateme import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess; import static org.zwobble.couscous.ast.FormalTypeParameterNode.formalTypeParameter; import static org.zwobble.couscous.ast.IfStatementNode.ifStatement; +import static org.zwobble.couscous.ast.LiteralNode.UNIT; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; @@ -235,6 +236,17 @@ public class JavaReaderTests { } @Test + public void canReadTryWithEmptyFinallyClause() { + assertThat( + readStatement("void", "try { return; } finally { }"), + isTryStatement( + hasTryBody(list(returns(UNIT))), + hasFinally() + ) + ); + } + + @Test public void canReadTryWithResourceWithoutOtherClauses() { ScalarType type = ScalarType.of("java.io.ByteArrayOutputStream"); Identifier identifier = MAIN_IDENTIFIER.variable("closeable"); diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java index 5815e68..c8fede8 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java @@ -86,7 +86,10 @@ public class NodeMatchers { } public static Matcher<TryNode> hasFinally(StatementNode... statements) { - return hasFeature("finally clause", TryNode::getFinallyBody, contains(statements)); + Matcher<Iterable<? extends StatementNode>> statementsMatcher = statements.length == 0 + ? emptyIterable() + : contains(statements); + return hasFeature("finally clause", TryNode::getFinallyBody, statementsMatcher); } @SafeVarargs |
