001 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
002 // for details. All rights reserved. Use of this source code is governed by a
003 // BSD-style license that can be found in the LICENSE file.
004
005 package org.jetbrains.kotlin.js.backend.ast;
006
007 import org.jetbrains.kotlin.js.util.AstUtil;
008 import org.jetbrains.annotations.NotNull;
009 import org.jetbrains.annotations.Nullable;
010
011 /**
012 * Represents a JavaScript if statement.
013 */
014 public final class JsIf extends SourceInfoAwareJsNode implements JsStatement {
015 @NotNull
016 private JsExpression ifExpression;
017
018 @NotNull
019 private JsStatement thenStatement;
020
021 @Nullable
022 private JsStatement elseStatement;
023
024 public JsIf(@NotNull JsExpression ifExpression, @NotNull JsStatement thenStatement, @Nullable JsStatement elseStatement) {
025 this.ifExpression = ifExpression;
026 this.thenStatement = thenStatement;
027 this.elseStatement = elseStatement;
028 }
029
030 public JsIf(@NotNull JsExpression ifExpression, @NotNull JsStatement thenStatement) {
031 this(ifExpression, thenStatement, null);
032 }
033
034 @Nullable
035 public JsStatement getElseStatement() {
036 return elseStatement;
037 }
038
039 @NotNull
040 public JsExpression getIfExpression() {
041 return ifExpression;
042 }
043
044 @NotNull
045 public JsStatement getThenStatement() {
046 return thenStatement;
047 }
048
049 public void setElseStatement(@Nullable JsStatement elseStatement) {
050 this.elseStatement = elseStatement;
051 }
052
053 public void setIfExpression(@NotNull JsExpression ifExpression) {
054 this.ifExpression = ifExpression;
055 }
056
057 public void setThenStatement(@NotNull JsStatement thenStatement) {
058 this.thenStatement = thenStatement;
059 }
060
061 @Override
062 public void accept(JsVisitor v) {
063 v.visitIf(this);
064 }
065
066 @Override
067 public void acceptChildren(JsVisitor visitor) {
068 visitor.accept(ifExpression);
069 visitor.accept(thenStatement);
070 if (elseStatement != null) {
071 visitor.accept(elseStatement);
072 }
073 }
074
075 @Override
076 public void traverse(JsVisitorWithContext v, JsContext ctx) {
077 if (v.visit(this, ctx)) {
078 ifExpression = v.accept(ifExpression);
079 thenStatement = v.acceptStatement(thenStatement);
080 if (elseStatement != null) {
081 elseStatement = v.acceptStatement(elseStatement);
082 }
083 }
084 v.endVisit(this, ctx);
085 }
086
087 @NotNull
088 @Override
089 public JsIf deepCopy() {
090 JsExpression ifCopy = AstUtil.deepCopy(ifExpression);
091 JsStatement thenCopy = AstUtil.deepCopy(thenStatement);
092 JsStatement elseCopy = AstUtil.deepCopy(elseStatement);
093
094 return new JsIf(ifCopy, thenCopy, elseCopy).withMetadataFrom(this);
095 }
096 }