feat(joinir): Phase 84-5 if_phi.rs レガシーフォールバック完全削除

Phase 84-4-B で Case D を 0件に削減完了したことにより、
if_phi.rs のレガシーフォールバックが完全に不要になったため削除。

主な変更:
- if_phi.rs 削除(339行)
- test_utils.rs 新規作成(テスト専用ユーティリティ分離、127行)
- lifecycle.rs: if_phi 呼び出し削除、Phase 84-5 安全ガード追加
- env.rs: phi_fallback_disabled() を常に true に変更
- テスト: A/B テスト → GenericTypeResolver 単独テストに変更

検証結果:
- Case D: 0件(完全解消継続)
- Tests: 498 passed(Phase 84-4: 497 から +1)

Phase 84 プロジェクト完全達成: 15件 → 0件(100%削減)
純削減: 220行

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-02 21:09:15 +09:00
parent 21505b8b41
commit 7dbe0a682c
12 changed files with 334 additions and 394 deletions

View File

@ -2,17 +2,22 @@
## TL;DR
**現状**: 4 件の Case D 失敗Phase 83 + Phase 84-1 + Phase 84-2 + Phase 84-3 実装後
**現状**: Case D 失敗 0 件Phase 83〜84-4 実装後、dev ガード付きテストで panic なし
**主要原因**: BoxCall/Await/QMark の戻り値型が `value_types` に未登録なため、PHI/Copy グラフの「base 型」が欠落していること。
**主要原因(解消済み)**:
- Const 命令の型アテーション欠如Phase 84-1 で修正)
- Copy チェーンでの型伝播不足Phase 84-2 で修正)
- PHI + Copy グラフ上の型集約不足Phase 84-3 で PhiTypeResolver 導入)
- BoxCall/Await/QMark の戻り値型未登録Phase 84-4-B で修正)
**対応状況**:
- Phase 83: MethodReturnHintBoxP3-D実装で 20 件 → 15 件
- Phase 84-1: Const 命令型アノテーション追加で 15 件 → 12 件
- Phase 84-2: CopyTypePropagator 導入で 12 件 → 9 件
- Phase 84-3: PhiTypeResolver 導入で 9 件 → 4 件
- Phase 84-4-B: BoxCall 戻り値型登録で 4 件 → 0 件
**タスク**: BoxCall/Await/QMark 戻り値型の登録Phase 84-4と、if_phi フォールバックの最終縮退
**タスク候補**: if_phi フォールバックの完全削除Phase 84-5 / Phase 82 最終仕上げ)
---
@ -59,13 +64,10 @@ pub fn emit_integer(b: &mut MirBuilder, val: i64) -> ValueId {
- `mir_stage1_cli_entry_like_pattern_verifies` - return 系
- 他の return リテラルを含むテスト
### 残存する問題(現時点の整理
### 残存する問題(Phase 84 終了時点
- **BoxCall/Await/QMark 戻り値型の未登録**
- await 構文(`test_lowering_await_expression`
- QMark (`?`) 構文(`mir_lowering_of_qmark_propagate`
- Stage1 CLI 系の BoxCall 戻り値2 テスト)
- PhiTypeResolver 自体は設計通り動作しており、base 定義BoxCall 等)に型が入っていないために Case D が残っている。
- Case D panic は dev ガード付きテストでも 0 件。
- 残っている課題は「if_phi フォールバックそのものの削除」と、その前提となる `infer_type_from_phi*` callsite の整理のみ。
---
@ -118,6 +120,23 @@ pub fn emit_integer(b: &mut MirBuilder, val: i64) -> ValueId {
- Case D: 9 件 → 4 件(約 56% 削減)。
- 残り 4 件は BoxCall/Await/QMark 戻り値型が `value_types` に登録されていないため、PhiTypeResolver から見ても「base 型が不明」のケースとして扱われている。
### Phase 84-4: BoxCall/Await/QMark 戻り値型登録(完了)
**Status**: ✅ 実装完了Phase 84-4-B
**ファイル**:
- `src/mir/builder/utils.rs`(新規)
- `infer_boxcall_return_type()` ヘルパー関数を追加(約 75 行)
- 27 個のビルトイン Box メソッドに対する戻り値型マッピングを集約
- BoxCall lowering 呼び出し元(`emit_box_or_plugin_call` 相当)で、戻り値型を `value_types` に登録
**対応メソッド**(抜粋):
- StringBox / IntegerBox / BoolBox / ArrayBox / MapBox / Result-likeQMark 相当)/ Stage1CliBox など、計 27 メソッド。
**効果**:
- `NYASH_PHI_FALLBACK_DISABLED=1 cargo test --release --lib` 実行時の Case D panic が 4 件 → 0 件に。
- Await/QMark 系テストは BoxCall 経路の型登録で全て解消され、追加の Await 専用実装は不要となった。
---
## 推奨アクション
@ -135,16 +154,16 @@ pub fn emit_integer(b: &mut MirBuilder, val: i64) -> ValueId {
## 期待される最終結果
| Phase | Case D 件数 | 修正率 | 備考 |
|-------|------------|--------|-----|
| Phase 82 終了時 | 20 件 | - | lifecycle 修正後 |
| Phase 83 後 | 15 件 | 25% | MethodReturnHintBoxP3-D |
| Phase 84-1 後 | 12 件 | 40% | Const 型アノテーション |
| Phase 84-2 後 | 9 件 | 55% | CopyTypePropagator |
| Phase 84-3 後 | 4 件 | 80% | PhiTypeResolverPHI + Copy グラフ) |
| Phase 84-4 後(目標) | 0-2| 90-100% | BoxCall/Await/QMark 型登録 |
| Phase | Case D 件数 | 修正率 | 備考 |
|--------------|------------|--------|-----|
| Phase 82 終了時 | 20 件 | - | lifecycle 修正後 |
| Phase 83 後 | 15 件 | 25% | MethodReturnHintBoxP3-D |
| Phase 84-1 後 | 12 件 | 40% | Const 型アノテーション |
| Phase 84-2 後 | 9 件 | 55% | CopyTypePropagator |
| Phase 84-3 後 | 4 件 | 80% | PhiTypeResolverPHI + Copy グラフ) |
| Phase 84-4 後 | 0 件 | 100% | BoxCall/Await/QMark 型登録 |
**最終目標**: Case D を 0-2 件まで縮小し、`infer_type_from_phi*` を本線から外せる状態する。
**最終目標**: Case D を 0 件にし、`infer_type_from_phi*` を本線から外せる状態を達成済み。次ステップで if_phi フォールバック(約 300 行)を構造的に削除する。
---