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.util.AstUtil;
008    import org.jetbrains.annotations.NotNull;
009    import com.intellij.util.SmartList;
010    
011    import java.util.ArrayList;
012    import java.util.List;
013    
014    /**
015     * Represents a JavaScript block statement.
016     */
017    public class JsBlock extends SourceInfoAwareJsNode implements JsStatement {
018        @NotNull
019        private final List<JsStatement> statements;
020    
021        public JsBlock() {
022            this(new ArrayList<JsStatement>());
023        }
024    
025        public JsBlock(JsStatement statement) {
026            this(new SmartList<JsStatement>(statement));
027        }
028    
029        public JsBlock(JsStatement... statements) {
030            this(new SmartList<JsStatement>(statements));
031        }
032    
033        public JsBlock(@NotNull List<JsStatement> statements) {
034            this.statements = statements;
035        }
036    
037        @NotNull
038        public List<JsStatement> getStatements() {
039            return statements;
040        }
041    
042        public boolean isEmpty() {
043            return statements.isEmpty();
044        }
045    
046        public boolean isGlobalBlock() {
047            return false;
048        }
049    
050        @Override
051        public void accept(JsVisitor v) {
052            v.visitBlock(this);
053        }
054    
055        @Override
056        public void acceptChildren(JsVisitor visitor) {
057            visitor.acceptWithInsertRemove(statements);
058        }
059    
060        @Override
061        public void traverse(JsVisitorWithContext v, JsContext ctx) {
062            if (v.visit(this, ctx)) {
063                v.acceptStatementList(statements);
064            }
065            v.endVisit(this, ctx);
066        }
067    
068        @NotNull
069        @Override
070        public JsBlock deepCopy() {
071            return new JsBlock(AstUtil.deepCopy(statements)).withMetadataFrom(this);
072        }
073    }