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 com.intellij.util.SmartList;
009    import org.jetbrains.annotations.NotNull;
010    
011    import java.util.List;
012    
013    public final class JsObjectLiteral extends JsLiteral {
014        private final List<JsPropertyInitializer> properties;
015    
016        private final boolean multiline;
017    
018        public JsObjectLiteral() {
019            this(new SmartList<JsPropertyInitializer>());
020        }
021    
022        public JsObjectLiteral(boolean multiline) {
023            this(new SmartList<JsPropertyInitializer>(), multiline);
024        }
025    
026        public boolean isMultiline() {
027            return multiline;
028        }
029    
030        public JsObjectLiteral(List<JsPropertyInitializer> properties) {
031            this(properties, false);
032        }
033    
034        public JsObjectLiteral(List<JsPropertyInitializer> properties, boolean multiline) {
035            this.properties = properties;
036            this.multiline = multiline;
037        }
038    
039        public List<JsPropertyInitializer> getPropertyInitializers() {
040            return properties;
041        }
042    
043        @Override
044        public void accept(JsVisitor v) {
045            v.visitObjectLiteral(this);
046        }
047    
048        @Override
049        public void acceptChildren(JsVisitor visitor) {
050            visitor.acceptWithInsertRemove(properties);
051        }
052    
053        @Override
054        public void traverse(JsVisitorWithContext v, JsContext ctx) {
055            if (v.visit(this, ctx)) {
056                v.acceptList(properties);
057            }
058            v.endVisit(this, ctx);
059        }
060    
061        @NotNull
062        @Override
063        public JsObjectLiteral deepCopy() {
064            return new JsObjectLiteral(AstUtil.deepCopy(properties), multiline).withMetadataFrom(this);
065        }
066    }