# Phase 84: PHI 型推論完全箱化プロジェクト — 完全ガイド ## 📚 ドキュメント索引 ### Phase 84-3 完了報告(最新) 1. **[Phase 84-3 サマリー](phase84-3-summary.md)** ⭐ 最優先 - 削減実績: 9件 → 4件(56%削減) - PhiTypeResolver 実装成果 - Phase 84-4 への推奨 2. **[残り 4件の完全調査](phase84-3-remaining-4-analysis.md)** - 各テストの詳細分析 - 失敗パターン分類 - なぜ PhiTypeResolver で解決できないか 3. **[Phase 84-4 実装推奨](phase84-4-implementation-recommendation.md)** - BoxCall 型情報登録の実装方法 - dev フォールバック実装 - Await 型情報特殊処理 ### Phase 84-2 記録(参考) 4. **[Case D 残り 9件の調査](phase84-2-case-d-investigation.md)** - Phase 84-2 時点の分析 - GroupA/B/C 分類 - CopyTypePropagator 実装提案 5. **[Phase 84-2 詳細分析](phase84-case-d-detailed-analysis.md)** - 12件 → 9件削減の詳細 - テスト別失敗パターン ### 初期調査(アーカイブ) 6. **[Case D インデックス](phase84-case-d-index.md)** - Phase 84-1 の初期調査 - 12件の失敗パターン発見 ## 🎯 Phase 84 の全体像 ### 目標 **if_phi.rs レガシーフォールバックの完全削除** - 初期状態: 12件の Case D 失敗 - 現在: 4件(67%削減達成) - 最終目標: 0件(100%削減) ### 実装ロードマップ ``` Phase 82: フォールバック検出実装 ↓ (Case D: 12件検出) Phase 84-1: 初期調査・パターン分類 ↓ Phase 84-2: CopyTypePropagator 実装 ↓ (12件 → 9件, 25%削減) Phase 84-3: PhiTypeResolver 実装 ✅ 完了 ↓ (9件 → 4件, 56%削減) Phase 84-4: BoxCall/Await 型情報登録 ⏳ 次のステップ ↓ (4件 → 0件 目標) Phase 84-5: if_phi.rs 完全削除 ↓ ✨ 型推論システム完全箱化達成 ``` ## 📊 削減実績の詳細 ### Phase 別削減内訳 | Phase | 実装内容 | 削減件数 | 残存件数 | 削減率 | 累積削減率 | |-------|---------|---------|---------|--------|-----------| | Phase 82 | 初期検出 | - | 12件 | - | - | | Phase 84-2 | CopyTypePropagator | 3件 | 9件 | 25% | 25% | | **Phase 84-3** | **PhiTypeResolver** | **5件** | **4件** | **56%** | **67%** | | Phase 84-4 | BoxCall/Await 型登録 | 4件(目標) | 0件(目標) | 100% | 100% | ### パターン別解決状況 | パターン | 件数(初期) | Phase 84-2 後 | Phase 84-3 後 | Phase 84-4 目標 | |---------|------------|--------------|--------------|----------------| | GroupA: Loop 制御フロー | 7件 | 7件 | **0件** ✅ | 0件 | | GroupB: Stage1Cli 複雑型推論 | 2件 | 2件 | 2件 | **0件** 🎯 | | GroupC: await 特殊構文 | 1件 | 1件 | 1件 | **0件** 🎯 | | GroupD: QMark 特殊構文 | 0件 | 0件 | 1件(新規) | **0件** 🎯 | | **合計** | **10件** | **10件** | **4件** | **0件** | ## 🔬 技術的成果 ### Phase 84-3 で実装した箱 **PhiTypeResolver** (`src/mir/phi_core/phi_type_resolver.rs`) **責務**: PHI + Copy グラフを辿って、安全に型を決められるときだけ MirType を返す **アルゴリズム**: 1. DFS/BFS で root から探索開始 2. Copy → src へ進む 3. Phi → 各 incoming ValueId へ進む 4. それ以外(Const/Call/BoxCall/NewBox...)は base 定義 5. base_types 集合を収集し、1 種類なら返す **安全装置**: - visited セットで同じ ValueId を 2 回以上辿らない(ループ防止) - 探索上限で打ち切り(max_visits) ### 箱理論の実現 ``` [型生成レイヤー] - 型を作る ├─ emit_const() ├─ emit_box_call() ← Phase 84-4-B で型登録を追加 └─ build_await_expression() ← Phase 84-4-C で型登録を追加 [型伝播レイヤー] - 型を広げる ├─ CopyTypePropagator ← Phase 84-2 └─ PhiTypeResolver ← Phase 84-3 ✅ [統合レイヤー] - 全体を調整 └─ GenericTypeResolver [レガシー] - 削除予定 └─ if_phi.rs フォールバック ← Phase 84-5 で削除 ``` ## 🎯 Phase 84-4 実装ガイド ### 推奨実装順序 #### ステップ1: dev フォールバック(0.5日) **目的**: 開発環境の即座のアンブロック **実装**: `src/mir/builder/lifecycle.rs` ```rust if should_enable_dev_fallback() { if is_base_definition_with_missing_type(function, ret_val) { return Ok(MirType::Unknown); } } ``` **環境変数**: `NYASH_PHI_DEV_FALLBACK=1` #### ステップ2: BoxCall 型情報登録(1-2日) **目的**: GroupB(2件)+ GroupD(1件)の根本解決 **実装**: `src/mir/builder/builder_calls.rs` ```rust pub fn emit_box_call(...) -> Result { let dst = self.next_value_id(); self.emit_instruction(MirInstruction::BoxCall { ... })?; // 新機能: 戻り値型を推論して登録 if let Some(ret_ty) = self.infer_boxcall_return_type(box_val, method, &args) { self.value_types.insert(dst, ret_ty); } Ok(dst) } ``` #### ステップ3: Await 型情報特殊処理(0.5日) **目的**: GroupC(1件)の暫定解決 **実装**: `src/mir/builder/stmts.rs` ```rust pub(super) fn build_await_expression(...) -> Result { let result_id = self.next_value_id(); // 新機能: Unknown として型登録 self.value_types.insert(result_id, MirType::Unknown); self.emit_instruction(MirInstruction::Await { ... })?; Ok(result_id) } ``` ### 検証方法 ```bash # ステップ1 完了確認 NYASH_PHI_DEV_FALLBACK=1 NYASH_PHI_FALLBACK_DISABLED=1 cargo test --release --lib 2>&1 | grep "Case D" # 期待: 出力なし # ステップ2 完了確認 NYASH_PHI_FALLBACK_DISABLED=1 cargo test --release --lib 2>&1 | grep "Case D" | wc -l # 期待: 1(await のみ) # ステップ3 完了確認 NYASH_PHI_FALLBACK_DISABLED=1 cargo test --release --lib 2>&1 | grep "Case D" | wc -l # 期待: 0(全件解決) ``` ## 📝 関連ファイル ### 実装ファイル - `src/mir/phi_core/phi_type_resolver.rs` - Phase 84-3 実装 - `src/mir/phi_core/copy_type_propagator.rs` - Phase 84-2 実装 - `src/mir/join_ir/lowering/generic_type_resolver.rs` - 統合調整 - `src/mir/builder/lifecycle.rs` - 型推論エントリーポイント - `src/mir/join_ir/lowering/if_phi.rs` - 削除予定レガシー ### Phase 84-4 で修正するファイル - `src/mir/builder/lifecycle.rs` - dev フォールバック追加 - `src/mir/builder/builder_calls.rs` - BoxCall 型登録追加 - `src/mir/builder/stmts.rs` - Await 型登録追加 ## 🚀 次のアクション ### 優先度1: Phase 84-4-A 実装(即実装推奨) **目的**: 開発環境の即座のアンブロック **実装時間**: 0.5日 **参考**: [Phase 84-4 実装推奨](phase84-4-implementation-recommendation.md#phase-84-4-a-dev-フォールバック推奨-即実装) ### 優先度2: Phase 84-4-B 実装(根本解決) **目的**: BoxCall 型情報の完全追跡 **実装時間**: 1-2日 **参考**: [Phase 84-4 実装推奨](phase84-4-implementation-recommendation.md#phase-84-4-b-boxcall-型情報登録推奨-根本解決) ### 優先度3: Phase 84-4-C 実装(完全解決) **目的**: Await 型情報の暫定対応 **実装時間**: 0.5日 **参考**: [Phase 84-4 実装推奨](phase84-4-implementation-recommendation.md#phase-84-4-c-await-型情報特殊処理推奨-暫定対応) ### Phase 84-5: if_phi.rs 削除(最終ゴール) **前提条件**: Phase 84-4 完了(Case D = 0件) **実装内容**: 1. `src/mir/join_ir/lowering/if_phi.rs` 完全削除(約 300行) 2. `GenericTypeResolver` の if_phi 呼び出し削除 3. `lifecycle.rs` の Case D 処理を全て削除 4. ドキュメント更新: Phase 82-84 完了宣言 ## 📈 進捗追跡 ### 現在の状態 - ✅ Phase 82: フォールバック検出実装 - ✅ Phase 84-1: 初期調査・パターン分類 - ✅ Phase 84-2: CopyTypePropagator 実装(25%削減) - ✅ Phase 84-3: PhiTypeResolver 実装(56%削減) - ⏳ Phase 84-4: BoxCall/Await 型情報登録(次のステップ) - 🎯 Phase 84-5: if_phi.rs 完全削除(最終ゴール) ### 削減進捗 ``` 12件 ████████████ 100% ▼ Phase 84-2 (-25%) 9件 █████████ 75% ▼ Phase 84-3 (-44%) 4件 ████ 33% ▼ Phase 84-4 (-33% 目標) 0件 0% ✨ 完全達成 ``` ## 🎉 まとめ **Phase 84-3 の偉業**: - ✅ PhiTypeResolver 実装完了 - ✅ 56%削減達成(9件 → 4件) - ✅ GroupA(Loop 制御フロー)完全解決 - ✅ 箱理論に基づく型推論システムの明確化 **Phase 84-4 への期待**: - 🎯 BoxCall/Await 型情報登録による根本解決 - 🎯 残り 4件の完全解決(67% → 100%) - 🎯 if_phi.rs レガシー削除準備完了 **Phase 84 プロジェクトの意義**: - 🎯 型推論システムの完全箱化 - 🎯 レガシーフォールバック根絶 - 🎯 保守性・拡張性・パフォーマンスの飛躍的向上 **次のステップ**: [Phase 84-4 実装推奨](phase84-4-implementation-recommendation.md)を参照して実装開始!