| /* |
| * Copyright 2012, the Dart project authors. |
| * |
| * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except |
| * in compliance with the License. You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Unless required by applicable law or agreed to in writing, software distributed under the License |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.dart.engine.ast; |
| |
| import com.google.dart.engine.scanner.Token; |
| |
| import java.util.List; |
| |
| /** |
| * Instances of the class {@code TryStatement} represent a try statement. |
| * |
| * <pre> |
| * tryStatement ::= |
| * 'try' {@link Block block} ({@link CatchClause catchClause}+ finallyClause? | finallyClause) |
| * |
| * finallyClause ::= |
| * 'finally' {@link Block block} |
| * </pre> |
| * |
| * @coverage dart.engine.ast |
| */ |
| public class TryStatement extends Statement { |
| /** |
| * The token representing the 'try' keyword. |
| */ |
| private Token tryKeyword; |
| |
| /** |
| * The body of the statement. |
| */ |
| private Block body; |
| |
| /** |
| * The catch clauses contained in the try statement. |
| */ |
| private NodeList<CatchClause> catchClauses = new NodeList<CatchClause>(this); |
| |
| /** |
| * The token representing the 'finally' keyword, or {@code null} if the statement does not contain |
| * a finally clause. |
| */ |
| private Token finallyKeyword; |
| |
| /** |
| * The finally block contained in the try statement, or {@code null} if the statement does not |
| * contain a finally clause. |
| */ |
| private Block finallyBlock; |
| |
| /** |
| * Initialize a newly created try statement. |
| * |
| * @param tryKeyword the token representing the 'try' keyword |
| * @param body the body of the statement |
| * @param catchClauses the catch clauses contained in the try statement |
| * @param finallyKeyword the token representing the 'finally' keyword |
| * @param finallyBlock the finally block contained in the try statement |
| */ |
| public TryStatement(Token tryKeyword, Block body, List<CatchClause> catchClauses, |
| Token finallyKeyword, Block finallyBlock) { |
| this.tryKeyword = tryKeyword; |
| this.body = becomeParentOf(body); |
| this.catchClauses.addAll(catchClauses); |
| this.finallyKeyword = finallyKeyword; |
| this.finallyBlock = becomeParentOf(finallyBlock); |
| } |
| |
| @Override |
| public <R> R accept(AstVisitor<R> visitor) { |
| return visitor.visitTryStatement(this); |
| } |
| |
| @Override |
| public Token getBeginToken() { |
| return tryKeyword; |
| } |
| |
| /** |
| * Return the body of the statement. |
| * |
| * @return the body of the statement |
| */ |
| public Block getBody() { |
| return body; |
| } |
| |
| /** |
| * Return the catch clauses contained in the try statement. |
| * |
| * @return the catch clauses contained in the try statement |
| */ |
| public NodeList<CatchClause> getCatchClauses() { |
| return catchClauses; |
| } |
| |
| @Override |
| public Token getEndToken() { |
| if (finallyBlock != null) { |
| return finallyBlock.getEndToken(); |
| } else if (finallyKeyword != null) { |
| return finallyKeyword; |
| } else if (!catchClauses.isEmpty()) { |
| return catchClauses.getEndToken(); |
| } |
| return body.getEndToken(); |
| } |
| |
| /** |
| * Return the finally block contained in the try statement, or {@code null} if the statement does |
| * not contain a finally clause. |
| * |
| * @return the finally block contained in the try statement |
| */ |
| public Block getFinallyBlock() { |
| return finallyBlock; |
| } |
| |
| /** |
| * Return the token representing the 'finally' keyword, or {@code null} if the statement does not |
| * contain a finally clause. |
| * |
| * @return the token representing the 'finally' keyword |
| */ |
| public Token getFinallyKeyword() { |
| return finallyKeyword; |
| } |
| |
| /** |
| * Return the token representing the 'try' keyword. |
| * |
| * @return the token representing the 'try' keyword |
| */ |
| public Token getTryKeyword() { |
| return tryKeyword; |
| } |
| |
| /** |
| * Set the body of the statement to the given block. |
| * |
| * @param block the body of the statement |
| */ |
| public void setBody(Block block) { |
| body = becomeParentOf(block); |
| } |
| |
| /** |
| * Set the finally block contained in the try statement to the given block. |
| * |
| * @param block the finally block contained in the try statement |
| */ |
| public void setFinallyBlock(Block block) { |
| finallyBlock = becomeParentOf(block); |
| } |
| |
| /** |
| * Set the token representing the 'finally' keyword to the given token. |
| * |
| * @param finallyKeyword the token representing the 'finally' keyword |
| */ |
| public void setFinallyKeyword(Token finallyKeyword) { |
| this.finallyKeyword = finallyKeyword; |
| } |
| |
| /** |
| * Set the token representing the 'try' keyword to the given token. |
| * |
| * @param tryKeyword the token representing the 'try' keyword |
| */ |
| public void setTryKeyword(Token tryKeyword) { |
| this.tryKeyword = tryKeyword; |
| } |
| |
| @Override |
| public void visitChildren(AstVisitor<?> visitor) { |
| safelyVisitChild(body, visitor); |
| catchClauses.accept(visitor); |
| safelyVisitChild(finallyBlock, visitor); |
| } |
| } |