From 936968730c0f882f2ba8dfa91164abb901ac3c95 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 17 Apr 2016 17:17:34 +0100 Subject: Read finally clauses of try statements --- .../java/org/zwobble/couscous/ast/TryNode.java | 22 ++++++++++++++++++---- .../couscous/frontends/java/FreeVariables.java | 6 +++++- .../frontends/java/JavaStatementReader.java | 3 ++- .../java/org/zwobble/couscous/util/Optionals.java | 8 ++++++++ 4 files changed, 33 insertions(+), 6 deletions(-) (limited to 'src/main/java/org') diff --git a/src/main/java/org/zwobble/couscous/ast/TryNode.java b/src/main/java/org/zwobble/couscous/ast/TryNode.java index af0a892..bb276ee 100644 --- a/src/main/java/org/zwobble/couscous/ast/TryNode.java +++ b/src/main/java/org/zwobble/couscous/ast/TryNode.java @@ -8,16 +8,26 @@ import java.util.List; import static org.zwobble.couscous.util.ExtraLists.eagerMap; public class TryNode implements StatementNode { - public static TryNode tryStatement(List body, List exceptionHandlers) { - return new TryNode(body, exceptionHandlers); + public static TryNode tryStatement( + List body, + List exceptionHandlers, + List finallyBody) + { + return new TryNode(body, exceptionHandlers, finallyBody); } private final List body; private final List exceptionHandlers; + private final List finallyBody; - public TryNode(List body, List exceptionHandlers) { + public TryNode( + List body, + List exceptionHandlers, + List finallyBody) + { this.body = body; this.exceptionHandlers = exceptionHandlers; + this.finallyBody = finallyBody; } public List getBody() { @@ -28,6 +38,10 @@ public class TryNode implements StatementNode { return exceptionHandlers; } + public List getFinallyBody() { + return finallyBody; + } + @Override public T accept(StatementNodeMapper visitor) { return visitor.visit(this); @@ -39,7 +53,7 @@ public class TryNode implements StatementNode { transformer.transformStatements(body), eagerMap(exceptionHandlers, handler -> new ExceptionHandlerNode( transformer.transform(handler.getDeclaration()), - transformer.transformStatements(handler.getBody())))); + transformer.transformStatements(handler.getBody()))), finallyBody); } @Override diff --git a/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java b/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java index dc68db8..9fcec11 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/FreeVariables.java @@ -95,6 +95,10 @@ public class FreeVariables { private static Stream findDeclarations(Node root) { Stream declarations = descendantNodesAndSelf(root).flatMap(node -> toStream(tryCast(VariableNode.class, node))); - return declarations.map(VariableNode::getDeclaration); + Stream tryStatements = descendantNodesAndSelf(root).flatMap(node -> toStream(tryCast(TryNode.class, node))); + Stream handlers = tryStatements.flatMap(statement -> statement.getExceptionHandlers().stream()); + return Stream.concat( + declarations.map(VariableNode::getDeclaration), + handlers.map(ExceptionHandlerNode::getDeclaration)); } } 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 e8483f0..c3c4f21 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java @@ -170,7 +170,8 @@ class JavaStatementReader { List catchClauses = statement.catchClauses(); return list(tryStatement( readStatement(statement.getBody()), - eagerMap(catchClauses, this::readCatchClause))); + eagerMap(catchClauses, this::readCatchClause), + statement.getFinally() == null ? list() : readStatement(statement.getFinally()))); } private ExceptionHandlerNode readCatchClause(CatchClause clause) { diff --git a/src/main/java/org/zwobble/couscous/util/Optionals.java b/src/main/java/org/zwobble/couscous/util/Optionals.java index 979dc5f..fd57924 100644 --- a/src/main/java/org/zwobble/couscous/util/Optionals.java +++ b/src/main/java/org/zwobble/couscous/util/Optionals.java @@ -6,6 +6,14 @@ import java.util.function.BiFunction; public class Optionals { private Optionals() {} + public static Optional first(Optional first, Optional second) { + if (first.isPresent()) { + return first; + } else { + return second; + } + } + public static Optional flatMap( Optional first, Optional second, -- cgit v1.2.3