aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/frontends
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-22 22:16:11 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-22 22:28:21 +0100
commit9fb39b1cff12bb2ec80ac9cd798f8a50069f4afc (patch)
treea9cae7ef678b9ed1bedb3cf8babe1d956c52ddc4 /src/main/java/org/zwobble/couscous/frontends
parent06fdfffd7af368dcd60fa0d13d619af0c5336379 (diff)
Handle try-with-resources
Diffstat (limited to 'src/main/java/org/zwobble/couscous/frontends')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java42
1 files changed, 30 insertions, 12 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 c3c4f21..e75585f 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
@@ -1,5 +1,6 @@
package org.zwobble.couscous.frontends.java;
+import com.google.common.collect.Lists;
import org.eclipse.jdt.core.dom.*;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.sugar.SwitchCaseNode;
@@ -167,11 +168,24 @@ class JavaStatementReader {
private List<StatementNode> readTryStatement(TryStatement statement) {
@SuppressWarnings("unchecked")
- List<CatchClause> catchClauses = statement.catchClauses();
- return list(tryStatement(
- readStatement(statement.getBody()),
- eagerMap(catchClauses, this::readCatchClause),
- statement.getFinally() == null ? list() : readStatement(statement.getFinally())));
+ List<VariableDeclarationExpression> resources = statement.resources();
+ List<LocalVariableDeclarationNode> resourceDeclarations = eagerFlatMap(resources, this::readVariableDeclarationExpression);
+ List<StatementNode> body = readStatement(statement.getBody());
+ for (LocalVariableDeclarationNode resource : Lists.reverse(resourceDeclarations)) {
+ body = list(
+ resource,
+ tryStatement(body, list(), list(expressionStatement(methodCall(reference(resource), "close", list(), Types.VOID))))
+ );
+ }
+ @SuppressWarnings("unchecked")
+ List<CatchClause> javaCatchClauses = statement.catchClauses();
+ List<ExceptionHandlerNode> catchClauses = eagerMap(javaCatchClauses, this::readCatchClause);
+ List<StatementNode> finallyBody = statement.getFinally() == null ? list() : readStatement(statement.getFinally());
+ if (catchClauses.isEmpty() && finallyBody.isEmpty()) {
+ return body;
+ } else {
+ return list(tryStatement(body, catchClauses, finallyBody));
+ }
}
private ExceptionHandlerNode readCatchClause(CatchClause clause) {
@@ -191,18 +205,16 @@ class JavaStatementReader {
}
private List<StatementNode> readForStatement(ForStatement statement) {
- List javaInitialisers = statement.initializers();
+ @SuppressWarnings("unchecked")
+ List<VariableDeclarationExpression> javaInitialisers = statement.initializers();
if (javaInitialisers.size() != 1) {
throw new UnsupportedOperationException();
}
- VariableDeclarationExpression javaDeclaration = (VariableDeclarationExpression) javaInitialisers.get(0);
- @SuppressWarnings("unchecked")
- List<VariableDeclarationFragment> fragments = javaDeclaration.fragments();
@SuppressWarnings("unchecked")
List<Expression> updaters = statement.updaters();
return append(
- readDeclarationFragments(fragments, typeOf(javaDeclaration.getType())),
+ readVariableDeclarationExpression(javaInitialisers.get(0)),
whileLoop(
readExpression(Types.BOOLEAN, statement.getExpression()),
concat(
@@ -232,10 +244,16 @@ class JavaStatementReader {
@SuppressWarnings("unchecked")
List<VariableDeclarationFragment> fragments = statement.fragments();
Type type = typeOf(statement.getType());
- return readDeclarationFragments(fragments, type);
+ return (List)readDeclarationFragments(fragments, type);
+ }
+
+ private List<LocalVariableDeclarationNode> readVariableDeclarationExpression(VariableDeclarationExpression expression) {
+ @SuppressWarnings("unchecked")
+ List<VariableDeclarationFragment> fragments = expression.fragments();
+ return readDeclarationFragments(fragments, typeOf(expression.getType()));
}
- private List<StatementNode> readDeclarationFragments(
+ private List<LocalVariableDeclarationNode> readDeclarationFragments(
List<VariableDeclarationFragment> fragments,
Type type
) {