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 }