AST 工具
AST Tools 任务相当于我们用来管理所有生成文件的「秘密武器」。 其中包括 AST builder、visitor、诸如 ContentEq 与 ContentHash 的 trait,以及 TypeScript 类型——全部由机器生成。
例如下列文件会自动生成:
crates/oxc_ast/src/generated/ast_builder.rscrates/oxc_ast/src/generated/visit.rscrates/oxc_ast/src/generated/visit_mut.rscrates/oxc_ast/src/generated/derive_content_eq.rscrates/oxc_ast/src/generated/derive_content_hash.rsnpm/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 生成代码并写入文件。
基础设施
后续补充更多细节。