aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java2
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java12
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java5
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