diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-04-22 22:16:11 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-04-22 22:28:21 +0100 |
| commit | 9fb39b1cff12bb2ec80ac9cd798f8a50069f4afc (patch) | |
| tree | a9cae7ef678b9ed1bedb3cf8babe1d956c52ddc4 /src/main/java/org/zwobble | |
| parent | 06fdfffd7af368dcd60fa0d13d619af0c5336379 (diff) | |
Handle try-with-resources
Diffstat (limited to 'src/main/java/org/zwobble')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java | 42 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/util/ExtraLists.java | 2 |
2 files changed, 31 insertions, 13 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 ) { diff --git a/src/main/java/org/zwobble/couscous/util/ExtraLists.java b/src/main/java/org/zwobble/couscous/util/ExtraLists.java index 3ee0ce3..76d3de7 100644 --- a/src/main/java/org/zwobble/couscous/util/ExtraLists.java +++ b/src/main/java/org/zwobble/couscous/util/ExtraLists.java @@ -33,7 +33,7 @@ public class ExtraLists { return concat(list(value), list); } - public static <T> List<T> append(List<T> list, T value) { + public static <T> List<T> append(List<? extends T> list, T value) { return Stream.concat(list.stream(), Stream.of(value)).collect(Collectors.toList()); } |
