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        public void setQualifier(@NotNull JsExpression qualifier) {
038            this.qualifier = qualifier;
039        }
040    
041        @Override
042        public void accept(JsVisitor v) {
043            v.visitInvocation(this);
044        }
045    
046        @Override
047        public void acceptChildren(JsVisitor visitor) {
048            visitor.accept(qualifier);
049            visitor.acceptList(arguments);
050        }
051    
052        @Override
053        public void traverse(JsVisitorWithContext v, JsContext ctx) {
054            if (v.visit(this, ctx)) {
055                qualifier = v.accept(qualifier);
056                v.acceptList(arguments);
057            }
058            v.endVisit(this, ctx);
059        }
060    
061        @NotNull
062        @Override
063        public JsInvocation deepCopy() {
064            JsExpression qualifierCopy = AstUtil.deepCopy(qualifier);
065            List<JsExpression> argumentsCopy = AstUtil.deepCopy(arguments);
066            return new JsInvocation(qualifierCopy, argumentsCopy).withMetadataFrom(this);
067        }
068    }