Files
hakorune/docs/development/current/main/phase236-exprlowerer-integration.md
nyash-codex d4f90976da refactor(joinir): Phase 244 - ConditionLoweringBox trait unification
Unify condition lowering logic across Pattern 2/4 with trait-based API.

New infrastructure:
- condition_lowering_box.rs: ConditionLoweringBox trait + ConditionContext (293 lines)
- ExprLowerer implements ConditionLoweringBox trait (+51 lines)

Pattern migrations:
- Pattern 2 (loop_with_break_minimal.rs): Use trait API
- Pattern 4 (loop_with_continue_minimal.rs): Use trait API

Benefits:
- Unified condition lowering interface
- Extensible for future lowering strategies
- Clean API boundary between patterns and lowering logic
- Zero code duplication

Test results: 911/911 PASS (+2 new tests)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-11 02:35:31 +09:00

3.9 KiB
Raw Blame History

Phase 236-EX: ExprLowerer/ScopeManager 本番導入Pattern2 条件)

目的: Phase 231/235 でパイロット実装・テストしてきた ExprLowerer/ScopeManager を、Pattern2 の break 条件 lowering に実際に使ってみて、既存の condition_to_joinir ベース経路と挙動が一致することを確認するフェーズだよ。影響範囲は Pattern2 の「break 条件」だけに限定する。


1. 現状の経路Task 236-1 メモ)

1.1 関連ファイル

  • src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs
    • Pattern 2 のルーティングと、lower_loop_with_break_minimal 呼び出しの入口。
    • Phase 231 で ExprLowerer による validation-only 呼び出しが挿入されている。
  • src/mir/join_ir/lowering/loop_with_break_minimal.rs
    • Pattern2 本体の JoinIR ライン。
    • lower_loop_with_break_minimal() の中で、condition_to_joinir::lower_condition_to_joinir を用いて
      • ループ条件
      • break 条件 の両方を JoinIR に lower している。
  • src/mir/join_ir/lowering/expr_lowerer.rs
    • Phase 231/235: ExprLowerer 本体。ScopeManager から ConditionEnv を組み立てて condition_lowerer::lower_condition_to_joinir に委譲する薄い箱。
  • src/mir/join_ir/lowering/scope_manager.rs
    • Phase 231: Pattern2ScopeManager 実装。ConditionEnv / LoopBodyLocalEnv / CapturedEnv / CarrierInfo を束ねて、名前→ValueId / VarScopeKind を返す。
  • src/mir/join_ir/lowering/condition_to_joinir.rs
    • 既存の condition lowering オーケストレータ。ConditionEnv + lower_condition_to_joinir + 変数抽出をまとめた API。

1.2 現在の break 条件 lowering の流れ

  1. pattern2_with_break.rs で:
    • LoopScopeShape や LoopBodyLocalEnv を構築。
    • ConditionEnvBuilder v2 相当で env: ConditionEnv を用意。
    • carrier_info / carrier_updates など Pattern2 メタ情報を集約。
  2. Phase 231 追加分:
    • Pattern2ScopeManager を上記 env + body_local_env + captured_env + carrier_info から組み立てる。
    • ExprLowerer を ExprContext::Condition で生成し、effective_break_condition一度 lower してみるだけ(結果 ValueId は捨てる)。
    • UnsupportedNode / VariableNotFound などはログ出力にとどめ、実際の lowering には関与しない。
  3. 本番 lowering:
    • lower_loop_with_break_minimal(...) を呼び出し、
    • その内部で condition_to_joinir::lower_condition_to_joinir により
      • ループ条件 AST
      • break 条件 AST をそれぞれ env: ConditionEnv を使って JoinIR 命令列 & ValueId に変換している。

1.3 Phase 236 の狙い

  • loop_with_break_minimal.rs 内の break 条件 lowering を、
    • 「ConditionEnv → lower_condition_to_joinir」から、
    • 「ScopeManager + ExprLowerer内部は既存 lower_condition_to_joinir を利用)」に置き換える。
  • ループ条件(自然終了条件)の lowering は従来どおり condition_to_joinir 経路のまま保持し、差分を break 条件のみに限定する。

2. 次フェーズとのつながりPhase 237-EX 予告)

  • Phase 237-EX では JsonParser/selfhost の条件パターンを棚卸しし、ExprLowerer/ScopeManager が今後どの条件を優先的に扱うかのカタログを作る予定だよ。
  • 参照: phase237-exprlowerer-condition-catalog.md(条件パターン一覧と ExprLowerer サポート状況の SSOT

3. その先Phase 238-EX との接続)

  • Phase 238-EX で Scope/Env の境界ルールを文書化し、ExprLowerer/ScopeManager/ConditionEnv/LoopBodyLocalEnv/UpdateEnv の責務を固定する予定。
  • 参照: phase238-exprlowerer-scope-boundaries.md(境界ルールと将来のガード案)。*** Status: Active
    Scope: ExprLowerer 統合JoinIR/ExprLowerer ライン)