背景
cargo outdated の棚卸しで chumsky だけ据え置きにした。0.10 → 0.12 で Spanned<T> の表現が変わっており、spctr の AST 全体が pub type Spanned<T> = (T, Span); を前提に書かれているので影響範囲が広い。
- 一度試した結果は
chumsky-0.12 ブランチで(push せず削除済み、再現はローカルで chumsky = "0.12" に上げるだけ)
- ビルドエラー:
expected struct Spanned<Expr>, found tuple (Expr, Range<usize>) がほぼ全モジュールで発生
何が変わった
- chumsky 0.10:
Spanned<T> = (T, Range<usize>) 互換
- chumsky 0.12:
chumsky::span::Spanned<T> は独立 struct(.value() / .span() でアクセス)
- combinator チェーンの
map(...) で chumsky の Spanned が投げ込まれるので、境界で変換するか AST 側を移行する必要
推奨手順
src/ast.rs の Spanned<T> を tuple alias から自前の struct に切り替え
#[derive(Clone, Debug)]
pub struct Spanned<T>(pub T, pub Span);
chumsky の Spanned は使わず、ファイル境界で自前の Spanned に詰め替える方針が AST の広範囲書き換えを避けられて手堅い
- 各モジュールの
.0/.1 access を確認(tuple の場合と同じインデックスアクセスができるよう Spanned struct を設計すれば多分 minimal)
src/parser.rs の chumsky combinator を 0.12 API に書き直し
.boxed() の挙動 / 場所が変わってないか要確認(型爆発の再来に注意)
cargo build --timings でビルド時間を計測しながら進める
src/typeck.rs の per-node types のキー(&Spanned<Expr> as *const _ as usize)が引き続き AST の安定アドレスを指すか確認
- テストは JIT 34 + snapshot 24 が全パスすることを確認
注意
- 「9 分ビルド」の前科あり。
.boxed() 配置が壊れると再発する
- 1 セッションで安全に終わるサイズではないので、別のまとまった時間で集中的にやる
参考
- 元の棚卸し commit: 63339e0(clap 2 → 4 等、chumsky 据え置き)
- 関連 ROADMAP セクション: chumsky の型爆発についてのメモ
背景
cargo outdatedの棚卸しでchumskyだけ据え置きにした。0.10 → 0.12 でSpanned<T>の表現が変わっており、spctr の AST 全体がpub type Spanned<T> = (T, Span);を前提に書かれているので影響範囲が広い。chumsky-0.12ブランチで(push せず削除済み、再現はローカルでchumsky = "0.12"に上げるだけ)expected struct Spanned<Expr>, found tuple (Expr, Range<usize>)がほぼ全モジュールで発生何が変わった
Spanned<T> = (T, Range<usize>)互換chumsky::span::Spanned<T>は独立 struct(.value() / .span()でアクセス)map(...)で chumsky の Spanned が投げ込まれるので、境界で変換するか AST 側を移行する必要推奨手順
src/ast.rsのSpanned<T>を tuple alias から自前の struct に切り替え.0/.1access を確認(tuple の場合と同じインデックスアクセスができるよう Spanned struct を設計すれば多分 minimal)src/parser.rsの chumsky combinator を 0.12 API に書き直し.boxed()の挙動 / 場所が変わってないか要確認(型爆発の再来に注意)cargo build --timingsでビルド時間を計測しながら進めるsrc/typeck.rsの per-node types のキー(&Spanned<Expr> as *const _ as usize)が引き続き AST の安定アドレスを指すか確認注意
.boxed()配置が壊れると再発する参考