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.google.dart.compiler.util.AstUtil; 009 import com.intellij.util.SmartList; 010 import org.jetbrains.annotations.NotNull; 011 import org.jetbrains.annotations.Nullable; 012 013 import java.util.*; 014 015 /** 016 * A JavaScript <code>var</code> statement. 017 */ 018 public class JsVars extends SourceInfoAwareJsNode implements JsStatement, Iterable<JsVars.JsVar> { 019 private final List<JsVar> vars; 020 021 private final boolean multiline; 022 023 public JsVars() { 024 this(new SmartList<JsVar>(), false); 025 } 026 027 public JsVars(boolean multiline) { 028 this(new SmartList<JsVar>(), multiline); 029 } 030 031 public JsVars(List<JsVar> vars, boolean multiline) { 032 this.vars = vars; 033 this.multiline = multiline; 034 } 035 036 public JsVars(JsVar var) { 037 this(new SmartList<JsVar>(var), false); 038 } 039 040 public JsVars(JsVar... vars) { 041 this(new SmartList<JsVar>(vars), false); 042 } 043 044 public boolean isMultiline() { 045 return multiline; 046 } 047 048 /** 049 * A var declared using the JavaScript <code>var</code> statement. 050 */ 051 public static class JsVar extends SourceInfoAwareJsNode implements HasName { 052 private final JsName name; 053 private JsExpression initExpression; 054 055 public JsVar(JsName name) { 056 this.name = name; 057 } 058 059 public JsVar(JsName name, @Nullable JsExpression initExpression) { 060 this.name = name; 061 this.initExpression = initExpression; 062 } 063 064 public JsExpression getInitExpression() { 065 return initExpression; 066 } 067 068 @Override 069 public JsName getName() { 070 return name; 071 } 072 073 @Override 074 public Symbol getSymbol() { 075 return name; 076 } 077 078 public void setInitExpression(JsExpression initExpression) { 079 this.initExpression = initExpression; 080 } 081 082 @Override 083 public void accept(JsVisitor v) { 084 v.visit(this); 085 } 086 087 @Override 088 public void acceptChildren(JsVisitor visitor) { 089 if (initExpression != null) { 090 visitor.accept(initExpression); 091 } 092 } 093 094 @Override 095 public void traverse(JsVisitorWithContext v, JsContext ctx) { 096 if (v.visit(this, ctx)) { 097 if (initExpression != null) { 098 initExpression = v.accept(initExpression); 099 } 100 } 101 v.endVisit(this, ctx); 102 } 103 104 @NotNull 105 @Override 106 public JsVar deepCopy() { 107 if (initExpression == null) return new JsVar(name); 108 109 return new JsVar(name, initExpression.deepCopy()).withMetadataFrom(this); 110 } 111 } 112 113 public void add(JsVar var) { 114 vars.add(var); 115 } 116 117 public void addAll(Collection<? extends JsVars.JsVar> vars) { 118 this.vars.addAll(vars); 119 } 120 121 public void addAll(JsVars otherVars) { 122 this.vars.addAll(otherVars.vars); 123 } 124 125 public void addIfHasInitializer(JsVar var) { 126 if (var.getInitExpression() != null) { 127 add(var); 128 } 129 } 130 131 public boolean isEmpty() { 132 return vars.isEmpty(); 133 } 134 135 @Override 136 public Iterator<JsVar> iterator() { 137 return vars.iterator(); 138 } 139 140 public List<JsVar> getVars() { 141 return vars; 142 } 143 144 @Override 145 public void accept(JsVisitor v) { 146 v.visitVars(this); 147 } 148 149 @Override 150 public void acceptChildren(JsVisitor visitor) { 151 visitor.acceptWithInsertRemove(vars); 152 } 153 154 @Override 155 public void traverse(JsVisitorWithContext v, JsContext ctx) { 156 if (v.visit(this, ctx)) { 157 v.acceptList(vars); 158 } 159 v.endVisit(this, ctx); 160 } 161 162 @NotNull 163 @Override 164 public JsVars deepCopy() { 165 return new JsVars(AstUtil.deepCopy(vars), multiline).withMetadataFrom(this); 166 } 167 }