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