Files
hakorune/docs/development/current/main/phase84-case-d-summary.md
nyash-codex 7dbe0a682c 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>
2025-12-02 21:09:15 +09:00

185 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 84: Case D 分析サマリー(エグゼクティブサマリー)
## TL;DR
**現状**: Case D 失敗 0 件Phase 83〜84-4 実装後、dev ガード付きテストで panic なし)
**主要原因(解消済み)**:
- 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 件
**次タスク候補**: if_phi フォールバックの完全削除Phase 84-5 / Phase 82 最終仕上げ)
---
## 問題の核心
### 初期段階Const 命令の型アノテーション欠如
```rust
// Integer/Bool/Float/Null/Void は型を登録しない
pub fn emit_integer(b: &mut MirBuilder, val: i64) -> ValueId {
let dst = b.next_value_id();
b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::Integer(val),
});
dst // ← value_types に何も登録していない!
}
```
### ✅ 修正版
```rust
pub fn emit_integer(b: &mut MirBuilder, val: i64) -> ValueId {
let dst = b.next_value_id();
b.emit_instruction(MirInstruction::Const {
dst,
value: ConstValue::Integer(val),
});
b.value_types.insert(dst, MirType::Integer); // ← この1行を追加
dst
}
```
**同様の修正を `emit_bool`/`emit_float`/`emit_null`/`emit_void` にも適用**
---
## 影響範囲
### 修正されるテスト(推定 14-16 件)
- `mir_locals_uninitialized` - `return 0` の型
- `mir_stageb_like_*_verifies` (7件) - 全て return 系
- `mir_stage1_cli_entry_like_pattern_verifies` - return 系
- 他の return リテラルを含むテスト
### 残存する問題Phase 84 終了時点)
- Case D panic は dev ガード付きテストでも 0 件。
- 残っている課題は「if_phi フォールバックそのものの削除」と、その前提となる `infer_type_from_phi*` callsite の整理のみ。
---
## 実装計画
### Phase 84-1: Const命令型アテーション完了
**Status**: ✅ 実装完了40dfbc68
**ファイル**: `src/mir/builder/emission/constant.rs`
**変更箇所**: 5 関数 × 1 行 = **5 行追加**
**効果**: Case D が 15 件 → 12 件Const 欠如グループは解消)
**所要時間**: 1-2 時間(テスト含む)
**リスク**: 極めて低いString は既に実装済み)
### Phase 84-2: Copy命令型伝播完了
**Status**: ✅ 実装完了CopyTypePropagator 導入)
**ファイル**:
- `src/mir/phi_core/copy_type_propagator.rs`(新規箱)
- `src/mir/phi_core/mod.rs`
- `src/mir/builder/lifecycle.rs`
**内容**:
- `CopyTypePropagator` が MIR 関数内の `Copy { dst, src }` を固定点ループで走査し、
`value_types[src]` の型を `value_types[dst]` に伝播Unknown のみ上書き)。
- `finalize_module` 内で return 型推論の前に実行。
**効果**:
- ベースラインテスト: 489 passed, 34 failed → 494 passed, 33 failed+5/-1
- Case D: 12 件 → 9 件(約 25% 削減)。
**箱理論チェック**:
- 単一責務Copy の型伝播のみ)、副作用は `value_types` 更新に限定、PHI/JoinIR には非依存。
### Phase 84-3: PHI型推論強化長期
**Status**: ✅ PhiTypeResolver 導入完了PHI + Copy グラフの安全な型推論)
**内容**:
- `PhiTypeResolver``Copy`/`Phi` グラフを DFS/BFS で辿り、末端の base 定義型が 1 種類に揃う場合にのみ MirType を返す。
- lifecycle.rs の return 型推論フローに統合し、P3-D/Const/CopyTypePropagator で埋まらないケースの一部を吸収。
**効果**:
- 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 専用実装は不要となった。
---
## 推奨アクション
1. **Phase 84-1 は完了済み**
- Const 命令の型アノテーション欠如グループは解消済み。
2. **Phase 84-2 も完了済み**
- Copy チェーンだけで説明できる Case D は削減済みで、残りは PHI 主体の複雑ケースに集中。
3. **Phase 84-3PhiTypeResolverは導入済み**
- PHI + Copy グラフ上で安全に決められるケースは吸収済みで、残り 4 件は「base 定義側に型がない」という別レイヤの問題に集約された。
---
## 期待される最終結果
| 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 件にし、`infer_type_from_phi*` を本線から外せる状態を達成済み。次ステップで if_phi フォールバック(約 300 行)を構造的に削除する。
---
## Phase 84-4 方針(案)
- Phase 84-4-A: dev フォールバック
- 開発時のみ PHI fallback を許可するガードを追加し、自分用のデバッグラインを確保。
- Phase 84-4-B: BoxCall 戻り値型の登録
- BoxCall lowering で戻り値型を `value_types` に登録し、Stage1 CLI 系 2 テストを根本解決。
- Phase 84-4-C: Await/QMark 戻り値型の処理
- await/QMark lowering で中間値の型を登録し、await/QMark テスト 2 件を解消。
---
## 詳細分析
完全な分析レポートは以下を参照:
- [phase84-case-d-detailed-analysis.md](./phase84-case-d-detailed-analysis.md)