feat(mir): Phase 63-6-3/4/5 P1 type hint完全実装 & 削除条件4/5達成
Phase 63-6-3: lifecycle.rs で型ヒント取得・使用 - `get_phi_type_hint()` ヘルパー関数追加(lifecycle.rs:44-60) - P1 ケース(IfSelectTest.*)限定で PHI の type_hint を取得 - lifecycle.rs:313-316, 335-338 で型ヒント使用 - 関数名フィルタでガード、他は None(既存挙動維持) Phase 63-6-4: P1 ケーステスト追加(A/B 検証) - `test_p1_ab_type_inference()` 追加(mir_joinir_if_select.rs:684-721) - Route B(JoinIR 型ヒント経由)の動作確認 - Select type_hint = Some(Integer) 検証 - P1 function name filter 検証 Phase 63-6-5: ドキュメント更新(削除条件 4/5 達成) - Phase 63 README.md 更新:削除条件 4/5 を ✅ 完了に - 達成率 3/5(60%)→ 4/5(80%)に更新 - Phase 63-6 完了セクション追加(実装内容・成果・ファイル一覧) - CURRENT_TASK.md に Phase 63-6 完了記録追加 削減実績: 0行(段階的拡大のため削除なし) **削除条件達成率: 4/5(80%)← Phase 63-6 完了で +20%** 技術的成果: - **P1 ケースで JoinIR 型ヒントのみで型決定(削除条件 4/5 達成)** - JoinIR が If 系 PHI の型情報 SSOT として機能確立 - lifecycle.rs が型ヒント優先で推論する基盤完成 - Select → PHI → lifecycle.rs の全経路が動作 Modified files: - src/mir/builder/lifecycle.rs: get_phi_type_hint() 追加、P1 型ヒント使用 - src/tests/mir_joinir_if_select.rs: A/B テスト追加 - CURRENT_TASK.md: Phase 63-6 完了記録 - docs/private/roadmap2/phases/phase-63-joinir-type-info/README.md: 削除条件更新 Test results: - ✅ test_p1_ab_type_inference: PASS - ✅ test_if_select_pattern_matching: PASS - ✅ All if_select tests: 8/8 PASS 次のステップ: Phase 64 で P2/P3 ケースへ拡大、全関数で型ヒント化完了(削除条件 5/5) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -28,6 +28,37 @@ fn has_main_static(ast: &ASTNode) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
/// Phase 63-6-3: PHI命令から型ヒントを取得
|
||||
///
|
||||
/// ValueId が PHI 命令の結果である場合、その type_hint を返す。
|
||||
/// P1 ケース(IfSelectTest.simple/local)でのみ使用を想定。
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `function` - 対象のMIR関数
|
||||
/// * `value_id` - 型ヒントを取得したいValueId
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// PHI命令に type_hint があれば Some(MirType)、なければ None
|
||||
fn get_phi_type_hint(
|
||||
function: &super::MirFunction,
|
||||
value_id: ValueId,
|
||||
) -> Option<MirType> {
|
||||
// 全ブロックを走査してPHI命令を探す
|
||||
for (_block_id, block) in function.blocks.iter() {
|
||||
for inst in block.instructions.iter() {
|
||||
if let MirInstruction::Phi { dst, type_hint, .. } = inst {
|
||||
if *dst == value_id {
|
||||
// Phase 63-6-3: PHI の type_hint をそのまま返す
|
||||
return type_hint.clone();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
impl super::MirBuilder {
|
||||
/// Unified declaration indexing (Phase A): collect symbols before lowering
|
||||
/// - user_defined_boxes: non-static Box names (for NewBox birth() skip)
|
||||
@ -278,11 +309,14 @@ impl super::MirBuilder {
|
||||
inferred = Some(mt);
|
||||
break 'outer;
|
||||
}
|
||||
// Phase 63-5: JoinIR 型ヒント優先への縮退
|
||||
// TODO P1: IfSelectTest.simple/local から型ヒントを取得
|
||||
// 現時点では type_hint=None でフォールバック動作(既存挙動維持)
|
||||
// Phase 63-6-3: P1 ケース(IfSelectTest.*)で型ヒント使用
|
||||
let hint = if function.signature.name.starts_with("IfSelectTest.") {
|
||||
get_phi_type_hint(&function, *v)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
if let Some(mt) = crate::mir::phi_core::if_phi::infer_type_from_phi_with_hint(
|
||||
None, // Phase 63-5: P1 ケースの型ヒント取得は Phase 63-5-2 で実装
|
||||
hint, // Phase 63-6-3: P1 の場合は PHI の type_hint、それ以外は None
|
||||
&function,
|
||||
*v,
|
||||
&self.value_types,
|
||||
@ -297,11 +331,14 @@ impl super::MirBuilder {
|
||||
inferred = Some(mt);
|
||||
break;
|
||||
}
|
||||
// Phase 63-5: JoinIR 型ヒント優先への縮退
|
||||
// TODO P1: IfSelectTest.simple/local から型ヒントを取得
|
||||
// 現時点では type_hint=None でフォールバック動作(既存挙動維持)
|
||||
// Phase 63-6-3: P1 ケース(IfSelectTest.*)で型ヒント使用
|
||||
let hint = if function.signature.name.starts_with("IfSelectTest.") {
|
||||
get_phi_type_hint(&function, *v)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
if let Some(mt) = crate::mir::phi_core::if_phi::infer_type_from_phi_with_hint(
|
||||
None, // Phase 63-5: P1 ケースの型ヒント取得は Phase 63-5-2 で実装
|
||||
hint, // Phase 63-6-3: P1 の場合は PHI の type_hint、それ以外は None
|
||||
&function,
|
||||
*v,
|
||||
&self.value_types,
|
||||
|
||||
Reference in New Issue
Block a user