Skip to content

Инструменты AST

Задача AST Tools — наш главный помощник для всех генерируемых файлов. Сюда входят билдер AST, обходчики (visitors), трейты вроде ContentEq и ContentHash, типы для 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 не славится скоростью, а процедурные макросы с таким объёмом кода только усугубляют ситуацию.

Если заставлять пользователей ждать генерацию на этапе сборки, UX для downstream-проектов сильно страдает.

И холодная, и инкрементальная сборка могут деградировать заметно.

RFC

Тема обсуждалась в RFC: codegen AST related codes; договорились о требованиях и пользовательском сценарии:

Требования

  • Не публикуем build.rs конечному пользователю.
  • Весь сгенерированный код коммитим в git.
  • Без nightly.
  • Источник истины — Rust; парсим типы с меткой #[ast].
  • По возможности избегать процедурных макросов на этапе компиляции.

Рабочий процесс

  • Пользователь меняет код в репозитории.
  • Watch подхватывает изменения.
  • Парсим все типы с #[ast].
  • Сохраняем сведения о типах AST в схеме.
  • Генерируем код из схемы и записываем в файлы.

Инфраструктура

Подробности — позже.