From 6a05243f10d97f9bc6308b4cd8d0140ab09745f7 Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Sun, 30 Nov 2025 06:14:52 +0900 Subject: [PATCH] =?UTF-8?q?feat(joinir):=20Phase=2065-2-B=20Box=20?= =?UTF-8?q?=E3=82=B3=E3=83=B3=E3=82=B9=E3=83=88=E3=83=A9=E3=82=AF=E3=82=BF?= =?UTF-8?q?=E5=9E=8B=E3=83=92=E3=83=B3=E3=83=88=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 65-2-B 完了:P3-B(Box コンストラクタ)型ヒント実装 ## 実装内容 ### 1. JoinInst::NewBox に type_hint 追加 - `src/mir/join_ir/mod.rs`: `type_hint: Option` フィールド追加 - 段階的拡大のため Optional 設計(既存コード破壊なし) ### 2. expr.rs で型ヒント自動推論 - `infer_box_type()` 関数使用で Box 名から型を自動推論 - ArrayBox → Box("ArrayBox") - StringBox → String - MapBox → Box("MapBox") - IntegerBox → Integer - BoolBox → Bool ### 3. convert.rs/json.rs で型ヒント対応 - パターンマッチに type_hint 追加(Phase 65-3 で活用予定) - JSON シリアライズ対応 ## テスト結果 - ✅ type_inference モジュール: 8/8 PASS - ✅ ビルド: 0 エラー ## 次のステップ - Phase 65-3: lifecycle.rs で P3-A/P3-B 型ヒント統合 --- 🌟 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/mir/join_ir/frontend/ast_lowerer/expr.rs | 5 +++++ src/mir/join_ir/json.rs | 3 +++ src/mir/join_ir/mod.rs | 4 ++++ src/mir/join_ir_vm_bridge/convert.rs | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/src/mir/join_ir/frontend/ast_lowerer/expr.rs b/src/mir/join_ir/frontend/ast_lowerer/expr.rs index b91e3b16..46d9a6b1 100644 --- a/src/mir/join_ir/frontend/ast_lowerer/expr.rs +++ b/src/mir/join_ir/frontend/ast_lowerer/expr.rs @@ -234,11 +234,16 @@ impl AstToJoinIrLowerer { // 結果変数を割り当て let dst = ctx.alloc_var(); + // Phase 65-2-B: Box 名から型ヒントを推論 + let type_hint = + crate::mir::join_ir::lowering::type_inference::infer_box_type(box_name); + // NewBox 命令を生成 let newbox_inst = JoinInst::NewBox { dst, box_name: box_name.to_string(), args: arg_vars, + type_hint, // Phase 65-2-B: P3-B Box コンストラクタ型ヒント }; let mut insts = arg_insts; diff --git a/src/mir/join_ir/json.rs b/src/mir/join_ir/json.rs index b4042bff..17cde1a9 100644 --- a/src/mir/join_ir/json.rs +++ b/src/mir/join_ir/json.rs @@ -277,6 +277,7 @@ fn write_inst(inst: &JoinInst, out: &mut W) -> std::io::Result<()> { dst, box_name, args, + type_hint, // Phase 65-2-B: 型ヒント追加(JSON には現状出力しない) } => { write!(out, "{{\"type\":\"new_box\"")?; write!(out, ",\"dst\":{}", dst.0)?; @@ -289,6 +290,8 @@ fn write_inst(inst: &JoinInst, out: &mut W) -> std::io::Result<()> { write!(out, "{}", arg.0)?; } write!(out, "]")?; + // Phase 65-2-B: TODO: type_hint を JSON に含めるかは Phase 65-3 で検討 + let _ = type_hint; // unused warning 回避 write!(out, "}}")?; } JoinInst::Compute(mir_like) => { diff --git a/src/mir/join_ir/mod.rs b/src/mir/join_ir/mod.rs index 8ef1554e..0120065b 100644 --- a/src/mir/join_ir/mod.rs +++ b/src/mir/join_ir/mod.rs @@ -359,10 +359,14 @@ pub enum JoinInst { /// Phase 51: Box インスタンス生成 /// new BoxName(args...) の構造を JoinIR で表現 /// MIR 変換時に NewBox 命令に変換 + /// + /// Phase 65-2-B: type_hint で生成される Box 型を伝播(infer_type_from_phi 削減用) NewBox { dst: VarId, box_name: String, args: Vec, + /// Phase 65-2-B: 生成される Box の型ヒント(P3-B Box コンストラクタ対応) + type_hint: Option, }, /// Phase 41-4: 深いネスト if の複数変数 merge(else なし) diff --git a/src/mir/join_ir_vm_bridge/convert.rs b/src/mir/join_ir_vm_bridge/convert.rs index ff4eff5b..aa5ebd1a 100644 --- a/src/mir/join_ir_vm_bridge/convert.rs +++ b/src/mir/join_ir_vm_bridge/convert.rs @@ -323,6 +323,7 @@ pub(crate) fn convert_join_function_to_mir( dst, box_name, args, + type_hint, // Phase 65-2-B: 型ヒント追加(現状は無視、Phase 65-3 で活用) } => { let mir_inst = MirInstruction::NewBox { dst: *dst, @@ -330,6 +331,9 @@ pub(crate) fn convert_join_function_to_mir( args: args.clone(), }; current_instructions.push(mir_inst); + + // Phase 65-2-B: TODO: type_hint を value_types に記録する処理を Phase 65-3 で追加 + let _ = type_hint; // 現状は unused warning 回避 } JoinInst::Call { func,