Steps 3-5 Summary: - ✅ Step 3: scan_blocks() extraction complete (94 lines, functional) - ⏳ Step 4-5: Documented plan/apply separation (requires future work) What was achieved: 1. scan_blocks() now identifies tail calls and returns (read-only) 2. Clear orchestrator structure documented in merge_and_rewrite() 3. Strategic markers show what belongs to each stage 4. Foundation laid for future extraction of plan/apply logic Current state: - scan_blocks(): 94 lines (EXTRACTED ✅) - plan_rewrites(): Stub (main loop lines 380-1469 contains logic) - apply_rewrites(): Stub (builder mutations intertwined with plan) - merge_and_rewrite(): ~1300 lines (needs further refactoring) Target state (future work): - scan_blocks(): ~100 lines (identification only) - plan_rewrites(): ~400 lines (block generation, no builder mutation) - apply_rewrites(): ~200 lines (builder mutation only) - merge_and_rewrite(): ~100-200 lines (orchestrator) Why partial completion: - Main loop (1400 lines) has highly intertwined plan + apply logic - Safe extraction requires careful separation (multi-session work) - Current commit achieves scan extraction + clear architecture docs - Follows 80/20 rule: Working scan stage + clear path forward Next steps (future): - Extract parameter binding logic → plan_rewrites() - Extract block generation logic → plan_rewrites() - Extract builder.add_block() calls → apply_rewrites() - Move PHI/carrier input collection → plan_rewrites() Build: cargo build --release ✅ Tests: Existing tests pass (no behavior changes) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
MIR Builder (src/mir/builder/)
このディレクトリは Rust 側の MIR 生成(AST → MIR)を担う。
JoinIR の merge もここ(control_flow/joinir/merge/)が入口。
原則(SSOT / Box-First)
- 状態は Context が SSOT:
MirBuilderの状態は Context(箱)に分割され、二重管理をしない。 - ValueId 発行は SSOT: 関数内の ValueId は
MirBuilder::next_value_id()を唯一入口にする。 - 境界は Fail-Fast: JoinIR merge は
contract_checks.rsで契約違反を早期検出する(debug-only)。
Context 構成(責務マップ)
core_context.rs- ID 生成器(ValueId/BlockId/BindingId 等)と最小の共通コア状態。
type_context.rs- ValueId → 型/種別/起源(NewBox 由来など)の追跡。
scope_context.rs- lexical scope / loop/if/try のスタックと、
current_function/current_blockの実行文脈。
- lexical scope / loop/if/try のスタックと、
binding_context.rs- 変数名 ↔ BindingId の対応(shadowing の復元を含む)。
variable_context.rs- 変数解決(variable_map 等)。
metadata_context.rs- span/source_hint/region(観測)などのメタ情報。
compilation_context.rs- コンパイル全体のレジストリ(Box/型レジストリ、reserved ids 等)。
context.rs- 上記 Context を束ねる入れ物(
MirBuilderはここを介して状態へアクセスする)。
- 上記 Context を束ねる入れ物(
主要エントリポイント
- ValueId/BlockId
src/mir/builder/utils.rs(MirBuilder::next_value_id()など)
- AST → MIR の基本道
src/mir/builder/stmts.rssrc/mir/builder/exprs.rs
- JoinIR merge(契約検証を含む)
src/mir/builder/control_flow/joinir/merge/mod.rssrc/mir/builder/control_flow/joinir/merge/contract_checks.rs
追加ルール(将来の変更者向け)
- 新しい状態を追加する場合は、まず「どの Context の責務か」を決めてから追加する(
MirBuilder直下に増やさない)。 - 変更後に最低限確認する:
tools/smokes/v2/profiles/integration/apps/phase135_trim_mir_verify.sh(MIR verify の回帰防止)