import type { GrammarAST } from "../tool/ast/GrammarAST.js";
import type { CommonTree } from "./CommonTree.js";
import { RewriteRuleElementStream } from "./RewriteRuleElementStream.js";
export declare class RewriteRuleSubtreeStream extends RewriteRuleElementStream {
    /**
     * Treats next element as a single node even if it's a subtree. This is used instead of next() when the result has
     * to be a tree root node. Also prevents us from duplicating recently-added children; e.g., ^(type ID)+ adds ID
     * to type and then 2nd iteration must dup the type node, but ID has been added.
     *
     * Referencing a rule result twice is ok. Dup entire tree as we can't be adding trees as root, e.g., expr expr.
     *
     * Hideous code duplication here with super.next().  Can't think of a proper way to refactor. This needs to always
     * call dup node and super.next() doesn't know which to call: dup node or dup tree.
     *
     * @returns The next node in the stream.
     */
    nextNode(): GrammarAST;
    protected dup(el: CommonTree): CommonTree;
}
