From 6598cd3272fc1828d720352dfb90dd1815c5a9fc Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Tue, 25 Nov 2025 15:48:00 +0900 Subject: [PATCH] refactor(joinir): F-3 add _with_scope variant for skip_ws lowering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 30 F-3: LoopScopeShape 実データ運用の一歩目 変更内容: - lower_case_a_skip_ws_with_scope(scope) 追加 - LoopScopeShape を直接受け取る新 API - CaseAContext::from_scope() 経由で ctx 構築 - lower_case_a_skip_ws_core(ctx) 抽出 - 共通ロジックを分離 - _for_minimal_skip_ws と _with_scope で共有 設計意図: - lowerer が scope を明示的に構築できる API を提供 - 将来の boxes 削除時に移行しやすい構造を準備 - 既存 API は後方互換性を維持 テスト結果: - JoinIR 関連テスト: 全 PASS - loop_scope_shape テスト: 10/10 PASS 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/mir/join_ir/lowering/generic_case_a.rs | 36 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/mir/join_ir/lowering/generic_case_a.rs b/src/mir/join_ir/lowering/generic_case_a.rs index 74febca6..6bebab0f 100644 --- a/src/mir/join_ir/lowering/generic_case_a.rs +++ b/src/mir/join_ir/lowering/generic_case_a.rs @@ -9,6 +9,8 @@ use std::collections::BTreeMap; use crate::mir::join_ir::lowering::loop_scope_shape::CaseAContext; +// Phase 30: LoopScopeShape は将来の _with_scope API 追加時に再インポート +// use crate::mir::join_ir::lowering::loop_scope_shape::LoopScopeShape; use crate::mir::join_ir::lowering::value_id_ranges; use crate::mir::join_ir::lowering::value_id_ranges::skip_ws as vid; use crate::mir::join_ir::lowering::value_id_ranges::stage1_using_resolver as stage1_vid; @@ -52,7 +54,37 @@ pub fn lower_case_a_loop_to_joinir_for_minimal_skip_ws( |offset| vid::loop_step(offset), )?; - // JoinModule を手書き skip_ws と同じ形で構築(ValueId 範囲も揃える) + // コア実装に委譲(Phase 30: _with_scope と共通化) + lower_case_a_skip_ws_core(&ctx) +} + +/// Phase 30: LoopScopeShape を直接受け取る skip_ws lowerer +/// +/// 呼び出し元で LoopScopeShape を明示的に構築し、この関数に渡す。 +/// CaseAContext::from_scope() 経由で ctx を作成。 +/// +/// # Arguments +/// +/// - `scope`: 事前に構築済みの LoopScopeShape +/// +/// # Returns +/// +/// Some(JoinModule) if successful, None if context building fails. +pub(crate) fn lower_case_a_skip_ws_with_scope( + scope: crate::mir::join_ir::lowering::loop_scope_shape::LoopScopeShape, +) -> Option { + // CaseAContext::from_scope() で ctx を構築 + let ctx = CaseAContext::from_scope(scope, "skip_ws", |offset| vid::loop_step(offset))?; + + // JoinModule 構築(既存 _for_minimal_skip_ws と同一ロジック) + lower_case_a_skip_ws_core(&ctx) +} + +/// skip_ws JoinModule 構築のコア実装 +/// +/// CaseAContext から JoinModule を構築する共通ロジック。 +/// `_for_minimal_skip_ws` と `_with_scope` の両方から呼ばれる。 +fn lower_case_a_skip_ws_core(ctx: &CaseAContext) -> Option { let string_key = ctx.pinned_name_or_first(0)?; let len_key = ctx.pinned_name_or_first(1).unwrap_or_else(|| string_key.clone()); let index_key = ctx.carrier_name_or_first(0)?; @@ -226,7 +258,7 @@ pub fn lower_case_a_loop_to_joinir_for_minimal_skip_ws( join_module.add_function(loop_step_func); eprintln!( - "[joinir/generic_case_a] ✅ constructed JoinIR (functions={}, value_range={}..{})", + "[joinir/generic_case_a] ✅ constructed JoinIR via _core (functions={}, value_range={}..{})", join_module.functions.len(), value_id_ranges::base::SKIP_WS, value_id_ranges::base::SKIP_WS + 1999