feat(joinir): Phase 40-4.1 delete collect_assigned_vars (35 lines)

Breaking: collect_assigned_vars function removed from if_phi.rs

Changes:
- Delete collect_assigned_vars() function (35 lines)
- Make JoinIR route the default in loop_builder.rs
- Rewrite collect_assigned_vars_via_joinir() with ast_to_json support
  - Now detects both Local declarations and Assignment nodes
  - Add extract_vars_from_json_stmts/stmt helpers
- Update tests to use new implementation
  - phase40_joinir_detects_local_declarations
  - phase40_joinir_nested_if_local

Test results: 407 passed, 11 failed (same as before, no regression)

🤖 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-28 11:07:01 +09:00
parent c7975d4bd9
commit 59f7f03efb
4 changed files with 143 additions and 185 deletions

View File

@ -1061,31 +1061,12 @@ impl<'a> LoopBuilder<'a> {
.debug_push_region(format!("join#{}", join_id) + "/join");
// Phase 25.1: HashSet → BTreeSet決定性確保
// Phase 40-3.5: JoinIR route switching
// Phase 40-4.1: JoinIR経路をデフォルト化collect_assigned_vars削除
let vars: std::collections::BTreeSet<String> =
if crate::config::env::use_joinir_for_array_filter() {
// Route B: JoinIR Frontend経由
crate::mir::phi_core::if_phi::collect_assigned_vars_via_joinir(
&then_body,
else_body.as_ref(),
)
} else {
// Route A: Legacy AST→MIR経由
let mut vars = std::collections::BTreeSet::new();
let then_prog = ASTNode::Program {
statements: then_body.clone(),
span: crate::ast::Span::unknown(),
};
crate::mir::phi_core::if_phi::collect_assigned_vars(&then_prog, &mut vars);
if let Some(es) = &else_body {
let else_prog = ASTNode::Program {
statements: es.clone(),
span: crate::ast::Span::unknown(),
};
crate::mir::phi_core::if_phi::collect_assigned_vars(&else_prog, &mut vars);
}
vars
};
crate::mir::phi_core::if_phi::collect_assigned_vars_via_joinir(
&then_body,
else_body.as_ref(),
);
// Phase 26-E: PhiBuilderBox 統合
// Ops構造体: PhiMergeOpsLegacyと PhiBuilderOpsの両対応