import { LookUp } from '../ast/base';
import { SyntaxNode, SyntaxNodeType } from '../ast';
import { TraversePath } from './traverse';
export type VisitListener<T extends SyntaxNode = SyntaxNode> = (path: TraversePath<T>) => void;
export type VisitHandlers = {
    [K in SyntaxNodeType]?: VisitListener<LookUp<SyntaxNode, K>>;
} & {
    [K in SyntaxNodeType as `exit${K}`]?: VisitListener<LookUp<SyntaxNode, K>>;
} & {
    enter?: VisitListener<SyntaxNode>;
    exit?: VisitListener<SyntaxNode>;
};
export declare const visit: <T extends SyntaxNode>(ast: T, handlers: VisitHandlers) => void;
export declare const visitNodes: <T extends SyntaxNode = SyntaxNode>(ast: SyntaxNode, callback: (p: TraversePath) => boolean) => T[];
