// 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;

public interface JsNode {
    /**
     * Causes this object to have the visitor visit itself and its children.
     *
     * @param visitor the visitor that should traverse this node
     */
    void accept(JsVisitor visitor);

    void acceptChildren(JsVisitor visitor);

    /**
     * Return the source info associated with this object.
     */
    Object getSource();

    /**
     * Set the source info associated with this object.
     *
     * @param info
     */
    void setSource(Object info);

    JsNode source(Object info);

    @NotNull
    JsNode deepCopy();

    /**
     * Causes this object to have the visitor visit itself and its children.
     *
     * @param visitor the visitor that should traverse this node
     * @param ctx the context of an existing traversal
     */
    void traverse(JsVisitorWithContext visitor, JsContext ctx);
}
