package org.zwobble.couscous.ast; import com.google.common.collect.Iterables; import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.ast.visitors.StatementNodeMapper; import java.util.List; import static org.zwobble.couscous.util.ExtraIterables.lazyFlatMap; import static org.zwobble.couscous.util.ExtraLists.eagerMap; public class TryNode implements StatementNode { 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, List finallyBody) { this.body = body; this.exceptionHandlers = exceptionHandlers; this.finallyBody = finallyBody; } public List getBody() { return body; } public List getExceptionHandlers() { return exceptionHandlers; } public List getFinallyBody() { return finallyBody; } @Override public T accept(StatementNodeMapper visitor) { return visitor.visit(this); } @Override public int type() { return NodeTypes.TRY; } @Override public Iterable childNodes() { return Iterables.concat( body, lazyFlatMap(exceptionHandlers, handler -> handler.getBody()), finallyBody ); } @Override public StatementNode transform(NodeTransformer transformer) { return new TryNode( transformer.transformStatements(body), eagerMap(exceptionHandlers, handler -> new ExceptionHandlerNode( transformer.transform(handler.getDeclaration()), transformer.transformStatements(handler.getBody()))), finallyBody); } @Override public String toString() { return "TryNode(" + "body=" + body + ", exceptionHandlers=" + exceptionHandlers + ", finallyBody=" + finallyBody + ')'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TryNode tryNode = (TryNode) o; if (!body.equals(tryNode.body)) return false; if (!exceptionHandlers.equals(tryNode.exceptionHandlers)) return false; return finallyBody.equals(tryNode.finallyBody); } @Override public int hashCode() { int result = body.hashCode(); result = 31 * result + exceptionHandlers.hashCode(); result = 31 * result + finallyBody.hashCode(); return result; } }