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 JsInvocation extends JsExpressionImpl.JsExpressionHasArguments {
014        @NotNull
015        private JsExpression qualifier;
016    
017        public JsInvocation(@NotNull JsExpression qualifier, @NotNull List<JsExpression> arguments) {
018            super(arguments);
019            this.qualifier = qualifier;
020        }
021    
022        public JsInvocation(@NotNull JsExpression qualifier, JsExpression... arguments) {
023            this(qualifier, new SmartList<JsExpression>(arguments));
024        }
025    
026        @NotNull
027        @Override
028        public List<JsExpression> getArguments() {
029            return arguments;
030        }
031    
032        @NotNull
033        public JsExpression getQualifier() {
034            return qualifier;
035        }
036    
037        @Override
038        public void accept(JsVisitor v) {
039            v.visitInvocation(this);
040        }
041    
042        @Override
043        public void acceptChildren(JsVisitor visitor) {
044            visitor.accept(qualifier);
045            visitor.acceptList(arguments);
046        }
047    
048        @Override
049        public void traverse(JsVisitorWithContext v, JsContext ctx) {
050            if (v.visit(this, ctx)) {
051                qualifier = v.accept(qualifier);
052                v.acceptList(arguments);
053            }
054            v.endVisit(this, ctx);
055        }
056    
057        @NotNull
058        @Override
059        public JsInvocation deepCopy() {
060            JsExpression qualifierCopy = AstUtil.deepCopy(qualifier);
061            List<JsExpression> argumentsCopy = AstUtil.deepCopy(arguments);
062            return new JsInvocation(qualifierCopy, argumentsCopy).withMetadataFrom(this);
063        }
064    }