refactor(joinir): F-3 add _with_scope variant for skip_ws lowering

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 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-25 15:48:00 +09:00
parent f41564723d
commit 6598cd3272

View File

@ -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<JoinModule> {
// 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<JoinModule> {
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