为什么 traversal 很重要
如果没有共享 traversal 层,每个 parser、generator 和 analyzer 都会重新写一套略有不同的递归规则。
这些重复实现往往会引入细微但麻烦的不一致。统一 traversal 模型能显著降低这种风险。
文档文章
Traversal explained
Traversal 把走树逻辑集中起来,让 generator 和 analyzer 更专注在自己的职责上。
Traversal 是对 Shape IR 的统一遍历机制,不管你是在生成输出、收集 diagnostics,还是未来做分析,都应该尽量复用同一套走树逻辑。
当 Shape IR 成为共享契约后,traversal 就成了避免代码库里重复递归逻辑的关键杠杆点。
如果没有共享 traversal 层,每个 parser、generator 和 analyzer 都会重新写一套略有不同的递归规则。
这些重复实现往往会引入细微但麻烦的不一致。统一 traversal 模型能显著降低这种风险。
这些规则能让 traversal 同时服务于当前 generator,以及后续更高层的工具能力。
具体 API 未来可以继续演进,但重要的是同一套 traversal contract 可以服务多个下游行为。
简化版 traversal 草图
function visitShape(shape: Shape, visitor: Visitor) {
visitor.enter?.(shape);
if (shape.kind === "array") {
visitShape(shape.element, visitor);
}
if (shape.kind === "object") {
for (const field of Object.values(shape.fields)) {
visitShape(field, visitor);
}
}
visitor.exit?.(shape);
}