Инструменты AST
Задача AST Tools — наш главный помощник для всех генерируемых файлов. Сюда входят билдер AST, обходчики (visitors), трейты вроде ContentEq и ContentHash, типы для 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 не славится скоростью, а процедурные макросы с таким объёмом кода только усугубляют ситуацию.
Если заставлять пользователей ждать генерацию на этапе сборки, UX для downstream-проектов сильно страдает.
И холодная, и инкрементальная сборка могут деградировать заметно.
RFC
Тема обсуждалась в RFC: codegen AST related codes; договорились о требованиях и пользовательском сценарии:
Требования
- Не публикуем
build.rsконечному пользователю. - Весь сгенерированный код коммитим в git.
- Без nightly.
- Источник истины — Rust; парсим типы с меткой
#[ast]. - По возможности избегать процедурных макросов на этапе компиляции.
Рабочий процесс
- Пользователь меняет код в репозитории.
- Watch подхватывает изменения.
- Парсим все типы с
#[ast]. - Сохраняем сведения о типах AST в схеме.
- Генерируем код из схемы и записываем в файлы.
Инфраструктура
Подробности — позже.