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 com.google.dart.compiler.backend.js.ast;
006    
007    import com.google.dart.compiler.util.AstUtil;
008    import org.jetbrains.annotations.NotNull;
009    
010    /**
011     * Represents a JavaScript if statement.
012     */
013    public final class JsIf extends SourceInfoAwareJsNode implements JsStatement {
014        private JsExpression ifExpression;
015        private JsStatement thenStatement;
016        private JsStatement elseStatement;
017    
018        public JsIf() {
019        }
020    
021        public JsIf(JsExpression ifExpression, JsStatement thenStatement, JsStatement elseStatement) {
022            this.ifExpression = ifExpression;
023            this.thenStatement = thenStatement;
024            this.elseStatement = elseStatement;
025        }
026    
027        public JsIf(JsExpression ifExpression, JsStatement thenStatement) {
028            this.ifExpression = ifExpression;
029            this.thenStatement = thenStatement;
030        }
031    
032        public JsStatement getElseStatement() {
033            return elseStatement;
034        }
035    
036        public JsExpression getIfExpression() {
037            return ifExpression;
038        }
039    
040        public JsStatement getThenStatement() {
041            return thenStatement;
042        }
043    
044        public void setElseStatement(JsStatement elseStatement) {
045            this.elseStatement = elseStatement;
046        }
047    
048        public void setIfExpression(JsExpression ifExpression) {
049            this.ifExpression = ifExpression;
050        }
051    
052        public void setThenStatement(JsStatement thenStatement) {
053            this.thenStatement = thenStatement;
054        }
055    
056        @Override
057        public void accept(JsVisitor v) {
058            v.visitIf(this);
059        }
060    
061        @Override
062        public void acceptChildren(JsVisitor visitor) {
063            visitor.accept(ifExpression);
064            visitor.accept(thenStatement);
065            if (elseStatement != null) {
066                visitor.accept(elseStatement);
067            }
068        }
069    
070        @Override
071        public void traverse(JsVisitorWithContext v, JsContext ctx) {
072            if (v.visit(this, ctx)) {
073                ifExpression = v.accept(ifExpression);
074                thenStatement = v.acceptStatement(thenStatement);
075                if (elseStatement != null) {
076                    elseStatement = v.acceptStatement(elseStatement);
077                }
078            }
079            v.endVisit(this, ctx);
080        }
081    
082        @NotNull
083        @Override
084        public JsIf deepCopy() {
085            JsExpression ifCopy = AstUtil.deepCopy(ifExpression);
086            JsStatement thenCopy = AstUtil.deepCopy(thenStatement);
087            JsStatement elseCopy = AstUtil.deepCopy(elseStatement);
088    
089            return new JsIf(ifCopy, thenCopy, elseCopy).withMetadataFrom(this);
090        }
091    }