41 lines
1 KiB
JavaScript
41 lines
1 KiB
JavaScript
import { createRequire } from "node:module";
|
|
|
|
// Lazy-loaded when first construct a `Visitor`
|
|
let walkProgram = null,
|
|
addVisitorToCompiled,
|
|
createCompiledVisitor,
|
|
finalizeCompiledVisitor;
|
|
|
|
/**
|
|
* Visitor class for traversing AST.
|
|
*/
|
|
export class Visitor {
|
|
#compiledVisitor = null;
|
|
|
|
constructor(visitor) {
|
|
if (walkProgram === null) {
|
|
const require = createRequire(import.meta.url);
|
|
({ walkProgram } = require("../../generated/visit/walk.js"));
|
|
({
|
|
addVisitorToCompiled,
|
|
createCompiledVisitor,
|
|
finalizeCompiledVisitor,
|
|
} = require("./visitor.js"));
|
|
}
|
|
|
|
const compiledVisitor = createCompiledVisitor();
|
|
addVisitorToCompiled(visitor);
|
|
const needsVisit = finalizeCompiledVisitor();
|
|
if (needsVisit) this.#compiledVisitor = compiledVisitor;
|
|
}
|
|
|
|
/**
|
|
* Visit AST.
|
|
* @param program - The AST to visit.
|
|
* @returns {undefined}
|
|
*/
|
|
visit(program) {
|
|
const compiledVisitor = this.#compiledVisitor;
|
|
if (compiledVisitor !== null) walkProgram(program, compiledVisitor);
|
|
}
|
|
}
|