// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. package org.jetbrains.kotlin.js.backend.ast; import org.jetbrains.kotlin.js.util.AstUtil; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; /** * A JavaScript <code>try</code> statement. */ public class JsTry extends SourceInfoAwareJsNode implements JsStatement { private final List<JsCatch> catches; private JsBlock finallyBlock; private JsBlock tryBlock; public JsTry() { catches = new SmartList<JsCatch>(); } public JsTry(JsBlock tryBlock, List<JsCatch> catches, @Nullable JsBlock finallyBlock) { this.tryBlock = tryBlock; this.catches = catches; this.finallyBlock = finallyBlock; } public JsTry(JsBlock tryBlock, @Nullable JsCatch jsCatch, @Nullable JsBlock finallyBlock) { this(tryBlock, new SmartList<JsCatch>(), finallyBlock); if (jsCatch != null) { catches.add(jsCatch); } } public List<JsCatch> getCatches() { return catches; } public JsBlock getFinallyBlock() { return finallyBlock; } public JsBlock getTryBlock() { return tryBlock; } public void setFinallyBlock(JsBlock block) { finallyBlock = block; } public void setTryBlock(JsBlock block) { tryBlock = block; } @Override public void accept(JsVisitor v) { v.visitTry(this); } @Override public void acceptChildren(JsVisitor visitor) { visitor.accept(tryBlock); visitor.acceptWithInsertRemove(catches); if (finallyBlock != null) { visitor.accept(finallyBlock); } } @Override public void traverse(JsVisitorWithContext v, JsContext ctx) { if (v.visit(this, ctx)) { tryBlock = v.acceptStatement(tryBlock); v.acceptList(catches); if (finallyBlock != null) { finallyBlock = v.acceptStatement(finallyBlock); } } v.endVisit(this, ctx); } @NotNull @Override public JsTry deepCopy() { JsBlock tryCopy = AstUtil.deepCopy(tryBlock); List<JsCatch> catchCopy = AstUtil.deepCopy(catches); JsBlock finallyCopy = AstUtil.deepCopy(finallyBlock); return new JsTry(tryCopy, catchCopy, finallyCopy).withMetadataFrom(this); } }