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.common.Symbol;
008    import com.intellij.util.SmartList;
009    import org.jetbrains.annotations.Nullable;
010    
011    import java.util.Arrays;
012    import java.util.Collections;
013    import java.util.Iterator;
014    import java.util.List;
015    
016    /**
017     * A JavaScript <code>var</code> statement.
018     */
019    public class JsVars extends SourceInfoAwareJsNode implements JsStatement, Iterable<JsVars.JsVar> {
020        private final List<JsVar> vars;
021    
022        private final boolean multiline;
023    
024        public JsVars() {
025            this(new SmartList<JsVar>(), false);
026        }
027    
028        public JsVars(boolean multiline) {
029            this(new SmartList<JsVar>(), multiline);
030        }
031    
032        public JsVars(List<JsVar> vars, boolean multiline) {
033            this.vars = vars;
034            this.multiline = multiline;
035        }
036    
037        public JsVars(JsVar var) {
038            this(Collections.singletonList(var), false);
039        }
040    
041        public JsVars(JsVar... vars) {
042            this(Arrays.asList(vars), false);
043        }
044    
045        public boolean isMultiline() {
046            return multiline;
047        }
048    
049        /**
050         * A var declared using the JavaScript <code>var</code> statement.
051         */
052        public static class JsVar extends SourceInfoAwareJsNode implements HasName {
053            private final JsName name;
054            private JsExpression initExpression;
055    
056            public JsVar(JsName name) {
057                this.name = name;
058            }
059    
060            public JsVar(JsName name, @Nullable JsExpression initExpression) {
061                this.name = name;
062                this.initExpression = initExpression;
063            }
064    
065            public JsExpression getInitExpression() {
066                return initExpression;
067            }
068    
069            @Override
070            public JsName getName() {
071                return name;
072            }
073    
074            @Override
075            public Symbol getSymbol() {
076                return name;
077            }
078    
079            public void setInitExpression(JsExpression initExpression) {
080                this.initExpression = initExpression;
081            }
082    
083            @Override
084            public void accept(JsVisitor v) {
085                v.visit(this);
086            }
087    
088            @Override
089            public void acceptChildren(JsVisitor visitor) {
090                if (initExpression != null) {
091                    visitor.accept(initExpression);
092                }
093            }
094        }
095    
096        public void add(JsVar var) {
097            vars.add(var);
098        }
099    
100        public void addIfHasInitializer(JsVar var) {
101            if (var.getInitExpression() != null) {
102                add(var);
103            }
104        }
105    
106        public boolean isEmpty() {
107            return vars.isEmpty();
108        }
109    
110        @Override
111        public Iterator<JsVar> iterator() {
112            return vars.iterator();
113        }
114    
115        @Override
116        public void accept(JsVisitor v) {
117            v.visitVars(this);
118        }
119    
120        @Override
121        public void acceptChildren(JsVisitor visitor) {
122            visitor.acceptWithInsertRemove(vars);
123        }
124    }