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    }