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 }