// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package org.jetbrains.kotlin.js.backend.ast;

import k2php.DebugGlobal;
import k2php.DebugTagged;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.js.util.AstUtil;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public final class JsInvocation extends JsExpression.JsExpressionHasArguments {
    @NotNull
    private JsExpression qualifier;

    public JsInvocation(@NotNull JsExpression qualifier, @NotNull List<? extends JsExpression> arguments) {
        super(new SmartList<JsExpression>(arguments));
        this.qualifier = qualifier;
        constructed();
    }

    public JsInvocation(@NotNull JsExpression qualifier, JsExpression... arguments) {
        this(qualifier, new SmartList<JsExpression>(arguments));
    }

    private void constructed() {
        initDebugTag();
    }

    @NotNull
    @Override
    public List<JsExpression> getArguments() {
        return arguments;
    }

    @NotNull
    public JsExpression getQualifier() {
        return qualifier;
    }

    public void setQualifier(@NotNull JsExpression qualifier) {
        this.qualifier = qualifier;
    }

    @Override
    public void accept(JsVisitor v) {
        v.visitInvocation(this);
    }

    @Override
    public void acceptChildren(JsVisitor visitor) {
        visitor.accept(qualifier);
        visitor.acceptList(arguments);
    }

    @Override
    public void traverse(JsVisitorWithContext v, JsContext ctx) {
        if (v.visit(this, ctx)) {
            qualifier = v.accept(qualifier);
            v.acceptList(arguments);
        }
        v.endVisit(this, ctx);
    }

    @NotNull
    @Override
    public JsInvocation deepCopy() {
        JsExpression qualifierCopy = AstUtil.deepCopy(qualifier);
        List<JsExpression> argumentsCopy = AstUtil.deepCopy(arguments);
        JsInvocation copy = new JsInvocation(qualifierCopy, argumentsCopy).withMetadataFrom(this);
        return copy;
    }

}


