Skip to content

AST 工具

AST Tools 任务相当于我们用来管理所有生成文件的「秘密武器」。 其中包括 AST builder、visitor、诸如 ContentEqContentHash 的 trait,以及 TypeScript 类型——全部由机器生成。

例如下列文件会自动生成:

  • crates/oxc_ast/src/generated/ast_builder.rs
  • crates/oxc_ast/src/generated/visit.rs
  • crates/oxc_ast/src/generated/visit_mut.rs
  • crates/oxc_ast/src/generated/derive_content_eq.rs
  • crates/oxc_ast/src/generated/derive_content_hash.rs
  • npm/oxc-types/src/generated/types.d.ts

背景

Rust 编译时间出了名的偏慢;用过程宏一次性生成如此多的代码只会让问题更重。

若在构建时再等代码生成完毕,会给下游项目的开发体验带来明显拖累。

不论冷编译还是增量编译,都可能严重回退

RFC

团队在 RFC: codegen AST related codes 中讨论了该议题,并就需求与用户故事达成共识:

需求

  • 不向用户发布的 crate 中包含 build.rs
  • 所有生成代码都提交到 Git。
  • 不要求 nightly。
  • Rust 源码为真理来源,需解析标有 #[ast] 的类型。
  • 尽可能避免编译期过程宏。

工作流

  • 用户在仓库中修改源码。
  • 监听改动并捕获变更。
  • 解析所有标记为 #[ast] 的类型。
  • 将全部 AST 类型细节写入 schema。
  • 依据 schema 生成代码并写入文件。

基础设施

后续补充更多细节。