123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- import type { ASTNode } from './ast';
- import { Kind } from './kinds';
- /**
- * A visitor is provided to visit, it contains the collection of
- * relevant functions to be called during the visitor's traversal.
- */
- export declare type ASTVisitor = EnterLeaveVisitor<ASTNode> | KindVisitor;
- declare type KindVisitor = {
- readonly [NodeT in ASTNode as NodeT['kind']]?:
- | ASTVisitFn<NodeT>
- | EnterLeaveVisitor<NodeT>;
- };
- interface EnterLeaveVisitor<TVisitedNode extends ASTNode> {
- readonly enter?: ASTVisitFn<TVisitedNode>;
- readonly leave?: ASTVisitFn<TVisitedNode>;
- }
- /**
- * A visitor is comprised of visit functions, which are called on each node
- * during the visitor's traversal.
- */
- export declare type ASTVisitFn<TVisitedNode extends ASTNode> = (
- /** The current node being visiting. */
- node: TVisitedNode,
- /** The index or key to this node from the parent node or Array. */
- key: string | number | undefined,
- /** The parent immediately above this node, which may be an Array. */
- parent: ASTNode | ReadonlyArray<ASTNode> | undefined,
- /** The key path to get to this node from the root node. */
- path: ReadonlyArray<string | number>,
- /**
- * All nodes and Arrays visited before reaching parent of this node.
- * These correspond to array indices in `path`.
- * Note: ancestors includes arrays which contain the parent of visited node.
- */
- ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,
- ) => any;
- /**
- * A reducer is comprised of reducer functions which convert AST nodes into
- * another form.
- */
- export declare type ASTReducer<R> = {
- readonly [NodeT in ASTNode as NodeT['kind']]?: {
- readonly enter?: ASTVisitFn<NodeT>;
- readonly leave: ASTReducerFn<NodeT, R>;
- };
- };
- declare type ASTReducerFn<TReducedNode extends ASTNode, R> = (
- /** The current node being visiting. */
- node: {
- [K in keyof TReducedNode]: ReducedField<TReducedNode[K], R>;
- },
- /** The index or key to this node from the parent node or Array. */
- key: string | number | undefined,
- /** The parent immediately above this node, which may be an Array. */
- parent: ASTNode | ReadonlyArray<ASTNode> | undefined,
- /** The key path to get to this node from the root node. */
- path: ReadonlyArray<string | number>,
- /**
- * All nodes and Arrays visited before reaching parent of this node.
- * These correspond to array indices in `path`.
- * Note: ancestors includes arrays which contain the parent of visited node.
- */
- ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,
- ) => R;
- declare type ReducedField<T, R> = T extends null | undefined
- ? T
- : T extends ReadonlyArray<any>
- ? ReadonlyArray<R>
- : R;
- /**
- * A KeyMap describes each the traversable properties of each kind of node.
- *
- * @deprecated Please inline it. Will be removed in v17
- */
- export declare type ASTVisitorKeyMap = {
- [NodeT in ASTNode as NodeT['kind']]?: ReadonlyArray<keyof NodeT>;
- };
- export declare const BREAK: unknown;
- /**
- * visit() will walk through an AST using a depth-first traversal, calling
- * the visitor's enter function at each node in the traversal, and calling the
- * leave function after visiting that node and all of its child nodes.
- *
- * By returning different values from the enter and leave functions, the
- * behavior of the visitor can be altered, including skipping over a sub-tree of
- * the AST (by returning false), editing the AST by returning a value or null
- * to remove the value, or to stop the whole traversal by returning BREAK.
- *
- * When using visit() to edit an AST, the original AST will not be modified, and
- * a new version of the AST with the changes applied will be returned from the
- * visit function.
- *
- * ```ts
- * const editedAST = visit(ast, {
- * enter(node, key, parent, path, ancestors) {
- * // @return
- * // undefined: no action
- * // false: skip visiting this node
- * // visitor.BREAK: stop visiting altogether
- * // null: delete this node
- * // any value: replace this node with the returned value
- * },
- * leave(node, key, parent, path, ancestors) {
- * // @return
- * // undefined: no action
- * // false: no action
- * // visitor.BREAK: stop visiting altogether
- * // null: delete this node
- * // any value: replace this node with the returned value
- * }
- * });
- * ```
- *
- * Alternatively to providing enter() and leave() functions, a visitor can
- * instead provide functions named the same as the kinds of AST nodes, or
- * enter/leave visitors at a named key, leading to three permutations of the
- * visitor API:
- *
- * 1) Named visitors triggered when entering a node of a specific kind.
- *
- * ```ts
- * visit(ast, {
- * Kind(node) {
- * // enter the "Kind" node
- * }
- * })
- * ```
- *
- * 2) Named visitors that trigger upon entering and leaving a node of a specific kind.
- *
- * ```ts
- * visit(ast, {
- * Kind: {
- * enter(node) {
- * // enter the "Kind" node
- * }
- * leave(node) {
- * // leave the "Kind" node
- * }
- * }
- * })
- * ```
- *
- * 3) Generic visitors that trigger upon entering and leaving any node.
- *
- * ```ts
- * visit(ast, {
- * enter(node) {
- * // enter any node
- * },
- * leave(node) {
- * // leave any node
- * }
- * })
- * ```
- */
- export declare function visit<N extends ASTNode>(
- root: N,
- visitor: ASTVisitor,
- visitorKeys?: ASTVisitorKeyMap,
- ): N;
- export declare function visit<R>(
- root: ASTNode,
- visitor: ASTReducer<R>,
- visitorKeys?: ASTVisitorKeyMap,
- ): R;
- /**
- * Creates a new visitor instance which delegates to many visitors to run in
- * parallel. Each visitor will be visited for each node before moving on.
- *
- * If a prior visitor edits a node, no following visitors will see that node.
- */
- export declare function visitInParallel(
- visitors: ReadonlyArray<ASTVisitor>,
- ): ASTVisitor;
- /**
- * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind.
- */
- export declare function getEnterLeaveForKind(
- visitor: ASTVisitor,
- kind: Kind,
- ): EnterLeaveVisitor<ASTNode>;
- /**
- * Given a visitor instance, if it is leaving or not, and a node kind, return
- * the function the visitor runtime should call.
- *
- * @deprecated Please use `getEnterLeaveForKind` instead. Will be removed in v17
- */
- export declare function getVisitFn(
- visitor: ASTVisitor,
- kind: Kind,
- isLeaving: boolean,
- ): ASTVisitFn<ASTNode> | undefined;
- export {};
|