// 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 org.jetbrains.annotations.NotNull;

import java.util.List;

public abstract class JsExpression extends SourceInfoAwareJsNode {
    /**
     * Determines whether or not this expression is a leaf, such as a
     * {@link JsNameRef}, {@link JsBooleanLiteral}, and so on. Leaf expressions
     * never need to be parenthesized.
     */
    public boolean isLeaf() {
        // Conservatively say that it isn't a leaf.
        // Individual subclasses can speak for themselves if they are a leaf.
        return false;
    }

    @NotNull
    public JsStatement makeStmt() {
        return new JsExpressionStatement(this);
    }

    public abstract static class JsExpressionHasArguments extends JsExpression implements HasArguments {
        protected final List<JsExpression> arguments;

        protected JsExpressionHasArguments(List<JsExpression> arguments) {
            this.arguments = arguments;
        }

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

    @Override
    public JsExpression source(Object info) {
        setSource(info);
        return this;
    }

    @NotNull
    @Override
    public abstract JsExpression deepCopy();
}
