// 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 org.jetbrains.annotations.NotNull; /** * Represents a JavaScript catch clause. */ public class JsCatch extends SourceInfoAwareJsNode implements HasCondition { protected final JsCatchScope scope; private JsBlock body; private JsExpression condition; private JsParameter param; public JsCatch(@NotNull JsName name) { param = new JsParameter(name); scope = null; } public JsCatch(JsScope parent, @NotNull String ident) { super(); assert (parent != null); scope = new JsCatchScope(parent, ident); param = new JsParameter(scope.findName(ident)); } public JsCatch(JsScope parent, @NotNull String ident, @NotNull JsStatement catchBody) { this(parent, ident); if (catchBody instanceof JsBlock) { body = (JsBlock) catchBody; } else { body = new JsBlock(catchBody); } } public JsBlock getBody() { return body; } @Override public JsExpression getCondition() { return condition; } public JsParameter getParameter() { return param; } public JsScope getScope() { return scope; } public void setBody(JsBlock body) { this.body = body; } @Override public void setCondition(JsExpression condition) { this.condition = condition; } @Override public void accept(JsVisitor v) { v.visitCatch(this); } @Override public void acceptChildren(JsVisitor visitor) { visitor.accept(param); if (condition != null) { visitor.accept(condition); } visitor.accept(body); } @Override public void traverse(JsVisitorWithContext v, JsContext ctx) { if (v.visit(this, ctx)) { param = v.accept(param); if (condition != null) { condition = v.accept(condition); } body = v.acceptStatement(body); } v.endVisit(this, ctx); } @NotNull @Override public JsCatch deepCopy() { JsCatchScope scopeCopy = scope != null ? scope.copy() : null; JsBlock bodyCopy = AstUtil.deepCopy(body); JsExpression conditionCopy = AstUtil.deepCopy(condition); JsParameter paramCopy = AstUtil.deepCopy(param); return new JsCatch(scopeCopy, bodyCopy, conditionCopy, paramCopy).withMetadataFrom(this); } private JsCatch(JsCatchScope scope, JsBlock body, JsExpression condition, JsParameter param) { this.scope = scope; this.body = body; this.condition = condition; this.param = param; } }