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

7.1 KiB
Raw Blame History

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 命令の型アノテーション欠如

// 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 に何も登録していない!
}

修正版

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 グラフの安全な型推論)

内容:

  • PhiTypeResolverCopy/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 件を解消。

詳細分析

完全な分析レポートは以下を参照: