feat(joinir): Phase 231 - ExprLowerer/ScopeManager pilot implementation
Pilot implementation of unified expression lowering for Pattern2 break conditions: New files: - scope_manager.rs (280 lines) - ScopeManager trait + Pattern2ScopeManager - expr_lowerer.rs (455 lines) - ExprLowerer with Condition context support Features: - Unified variable lookup across ConditionEnv/LoopBodyLocalEnv/CapturedEnv/CarrierInfo - Pre-validation of condition AST before lowering - Fail-safe design with fallback to legacy path - 8 new unit tests (all pass) Integration: - Pattern2 break condition uses ExprLowerer for pre-validation - Existing proven lowering path preserved - Zero impact on existing functionality (890/897 tests pass) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -337,8 +337,32 @@ Local Region (1000+):
|
||||
- Pattern4 への統合完了: LoopBodyLocal 条件の昇格成功時に lowering を続行(以前は Fail-Fast)。
|
||||
- Phase 223.5 実装内容:
|
||||
- Pattern2 への統合完了: header/break 条件を分析し昇格を試みる。
|
||||
- A-4(digit_pos)テスト追加: cascading LoopBodyLocal パターンで Fail-Fast 動作を確認。
|
||||
- error_messages.rs に Pattern2 用エラー関数追加: `format_error_pattern2_promotion_failed()` など。
|
||||
|
||||
- **ScopeManager / ExprLowerer(Phase 231 パイロット実装完了)**
|
||||
- ファイル:
|
||||
- `src/mir/join_ir/lowering/scope_manager.rs`
|
||||
- `src/mir/join_ir/lowering/expr_lowerer.rs`
|
||||
- 責務:
|
||||
- **ScopeManager trait**: 変数参照を統一的に扱う trait(ConditionEnv / LoopBodyLocalEnv / CapturedEnv / CarrierInfo を統合)。
|
||||
- **Pattern2ScopeManager**: Pattern2 専用の薄いラッパー(promoted_loopbodylocals 対応含む)。
|
||||
- **ExprLowerer**: 式 lowering を1箇所に集約(Phase 231: Condition context のみ、General context は将来実装)。
|
||||
- Phase 231 実装内容:
|
||||
- Pattern2 break 条件の **pre-validation** として ExprLowerer を試行(fallback 完備)。
|
||||
- 簡単な条件式(`i >= 5` など)を正常に検証、複雑なパターンは UnsupportedNode エラーで legacy path へ fallback。
|
||||
- 箱化・モジュール化の原則に準拠(ScopeManager は trait、ExprLowerer は再利用可能)。
|
||||
- 設計原則:
|
||||
- **Box-First**: ScopeManager は trait-based "box" で変数解決を抽象化。
|
||||
- **Fail-Safe**: 未対応 AST ノードは明示的エラーで fallback 可能(実行時エラーにしない)。
|
||||
- **Incremental Adoption**: Phase 231 は検証専用、Phase 232+ で実際の lowering 置き換え予定。
|
||||
- 使用箇所:
|
||||
- `pattern2_with_break.rs` の break 条件 lowering 前に pre-validation として実行。
|
||||
- 将来は Pattern1/Pattern3/Pattern4 にも拡大予定(Phase 232)。
|
||||
|
||||
- **DigitPosConditionNormalizer(Phase 224-E 実装完了)**
|
||||
- ファイル: `src/mir/join_ir/lowering/digitpos_condition_normalizer.rs`
|
||||
- 責務:
|
||||
- digit_pos 条件を正規化(`digit_pos < 0` → `!is_digit_pos`)。
|
||||
- Pattern2 の break 条件 lowering 前に呼び出され、promoted variable の条件を bool 形式に変換。
|
||||
- Phase 224 実装内容(Core Implementation Complete ⚠️):
|
||||
- **Two-tier promotion**: Step1 で A-3 Trim 試行 → 失敗なら Step2 で A-4 DigitPos 試行 → 両方失敗で Fail-Fast。
|
||||
- **DigitPosPromoter 統合**: cascading indexOf パターン(substring → indexOf → comparison)の昇格をサポート。
|
||||
@ -381,6 +405,7 @@ Local Region (1000+):
|
||||
- **単体テスト**: 5/5 PASS(happy path, wrong operator/variable/constant, non-binary-op)。
|
||||
- **E2E テスト**: `phase2235_p2_digit_pos_min.hako` で型エラー解消確認。
|
||||
- **回帰テスト**: digitpos (11 tests), trim (32 tests) 全て PASS。
|
||||
- **digit_pos 正規化ライン**: DigitPosPromoter + ConditionAlias + DigitPosConditionNormalizer で `digit_pos < 0` を bool キャリア `is_digit_pos` ベースの条件(`!is_digit_pos`)に直してから ConditionEnv / BoolExprLowerer へ渡す。
|
||||
- 参考:
|
||||
- 設計ドキュメント: `docs/development/current/main/phase224-digitpos-condition-normalizer.md`
|
||||
- 実装サマリ: `docs/development/current/main/PHASE_224_SUMMARY.md`
|
||||
@ -511,6 +536,7 @@ Local Region (1000+):
|
||||
- ExitMeta から exit_bindings を構築(Collector)。
|
||||
- 変数再接続はヘッダ PHI の dst を使って `builder.variable_map` を更新(Reconnector)。
|
||||
- expr 用の PHI には一切触れない(carrier 専用ライン)。
|
||||
- **ConditionOnly キャリア**: header PHI の entry は CarrierInit(BoolConst(false) 等)を起点にし、ExitLine では variable_map や ExprResult への書き戻しを行わずヘッダ PHI 経由に限定。
|
||||
|
||||
- **ExprResultResolver(Phase 221-R 実装済み)**
|
||||
- ファイル: `src/mir/builder/control_flow/joinir/merge/expr_result_resolver.rs`
|
||||
@ -738,6 +764,43 @@ Phase 210–221 で「数値ループ+if-sum」を実戦投入し、JoinIR イ
|
||||
|
||||
---
|
||||
|
||||
## 6. Roadmap(JoinIR の今後のゴール)
|
||||
|
||||
ここから先の JoinIR の「目指す形」を、箱レベルでざっくり書いておくよ。フェーズ詳細は各 phase ドキュメントに分散させて、このセクションは常に最新の方向性だけを保つ。
|
||||
|
||||
### 6.1 直近(Phase 176-177 まわり)
|
||||
|
||||
- **P5(Trim/JsonParser 系)ループの複数キャリア対応** ✅ Phase 176 完了 (2025-12-08)
|
||||
- 完了内容:
|
||||
- Pattern2 lowerer を全キャリア対応に拡張(ヘッダ PHI / ループ更新 / ExitLine)。
|
||||
- CarrierUpdateLowerer ヘルパで UpdateExpr → JoinIR 変換を統一。
|
||||
- 2キャリア(pos + result)E2E テスト完全成功。
|
||||
- 技術的成果:
|
||||
- CarrierInfo / ExitMeta / ExitLine / LoopHeaderPhiBuilder の multi-carrier 対応を Pattern2 lowerer で完全活用。
|
||||
- Trim pattern の「キャリア = ループ変数」という誤解を解消(loop_var は特殊キャリア)。
|
||||
- 次のステップ (Phase 177):
|
||||
- JsonParser `_parse_string` 本体を P2+P5 で通す(pos + result の 2 キャリアで実ループ動作確認)。
|
||||
|
||||
### 6.2 中期(selfhost depth‑2 / JsonParser 本体)
|
||||
|
||||
- **JsonParserBox / Trim 系ループの本線化**
|
||||
- 目標:
|
||||
- `_trim` / `_skip_whitespace` / `_parse_string` / `_parse_array` などの主要ループが、すべて JoinIR Pattern1–4 + P5 で通ること。
|
||||
- LoopConditionScopeBox + LoopBodyCarrierPromoter + TrimLoopHelper の上で安全に正規化できるループを広げていく。
|
||||
- 方針:
|
||||
- 「ループの形」は P1–P4 から増やさず、複雑さは BoolExprLowerer / ContinueBranchNormalizer / P5 系の補助箱で吸収する。
|
||||
- LoopPatternSpace の P6/P7/P12 候補(break+continue 同時 / 複数キャリア条件更新 / early return)は、実アプリで必要になった順に小さく足す。
|
||||
|
||||
- **selfhost depth‑2(.hako JoinIR/MIR Frontend)**
|
||||
- 目標:
|
||||
- `.hako → JsonParserBox → Program/MIR JSON → MirAnalyzerBox/JoinIrAnalyzerBox → VM/LLVM` の深度 2 ループを、日常的に回せるようにする。
|
||||
- Rust 側の JoinIR は「JSON を受け取って実行・検証するランナー層」、.hako 側が「JoinIR/MIR を構築・解析する言語側 SSOT」という役割分担に近づける。
|
||||
|
||||
- **Phase 230(ExprLowerer / ScopeManager 設計フェーズ)**
|
||||
- 目標: 条件式 / init 式 / carrier 更新式の lowering を将来ひとつの ExprLowerer + ScopeManager に統合できるよう、既存の散在する lowering/API/Env を設計レベルで整理する(このフェーズではコード変更なし)。
|
||||
|
||||
---
|
||||
|
||||
## 5. selfhost / .hako JoinIR Frontend との関係
|
||||
|
||||
JoinIR は Rust 側だけでなく、将来的に .hako selfhost コンパイラ側でも生成・解析される予定だよ:
|
||||
|
||||
Reference in New Issue
Block a user