- Implement PinnedLocalAnalyzer box to identify pinned loop-outer locals * Pure AST analysis (no MIR dependencies) * Detects locals: defined before loop, referenced in loop, NOT assigned in loop * 5 unit tests covering all edge cases (no assignment, assigned, empty body, etc.) - Integrate PinnedLocalAnalyzer into pattern2_with_break.rs * Call analyzer with loop body AST and candidate locals from variable_map * Wire pinned locals into CapturedEnv with CapturedKind::Pinned * Fail-Fast on host_id lookup failure or analyzer errors - Update loop_body_local_init.rs resolver to search CapturedEnv * New search order: LoopBodyLocalEnv → ConditionEnv → CapturedEnv * Access via cond_env.captured (already integrated in ConditionEnv) * Updated error message to show full search order - All existing tests pass (1101 passed, 1 unrelated failure) - Smoke tests verified: phase96_json_loader_next_non_ws_vm, phase94_p5b_escape_e2e 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 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 の回帰防止)