feat(joinir): Task 200-2 - JoinInlineBoundaryBuilder implementation for Pattern2

Builder pattern for JoinInlineBoundary construction, reduces field manipulation scattering.

# Changes
- NEW: src/mir/join_ir/lowering/inline_boundary_builder.rs (165 lines)
  - JoinInlineBoundaryBuilder with 7 fluent methods
  - Complete unit test coverage (4 tests)
- MODIFIED: src/mir/join_ir/lowering/mod.rs (+2 lines)
  - Export inline_boundary_builder module
  - Public re-export of JoinInlineBoundaryBuilder
- MODIFIED: src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs
  - Replace direct boundary field manipulation with builder pattern
  - 9 lines of field assignments → fluent builder chain

# Benefits
- **Centralized**: All boundary construction logic in builder
- **Readable**: Fluent API shows construction intent clearly
- **Maintainable**: Changes to boundary structure isolated to builder
- **Type Safe**: Builder validates field consistency

# Tests
 All builder unit tests pass (4/4)
 All pattern module tests pass (30+)
 Library build succeeds with no errors

🤖 Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-08 04:25:58 +09:00
parent 3571a97458
commit 3645a3c2d2
4 changed files with 262 additions and 10 deletions

View File

@ -328,15 +328,18 @@ impl MirBuilder {
use crate::mir::builder::control_flow::joinir::merge::exit_line::ExitMetaCollector;
let exit_bindings = ExitMetaCollector::collect(self, &exit_meta, debug);
// Phase 33-22: Create boundary with Pattern 2 specific settings
let mut boundary = crate::mir::join_ir::lowering::inline_boundary::JoinInlineBoundary::new_inputs_only(
vec![ValueId(0)], // JoinIR's main() parameter (loop variable init)
vec![loop_var_id], // Host's loop variable
);
boundary.condition_bindings = condition_bindings;
boundary.exit_bindings = exit_bindings.clone();
boundary.expr_result = fragment_meta.expr_result; // Phase 33-14: Pass expr_result to merger
boundary.loop_var_name = Some(loop_var_name.clone()); // Phase 33-16: For LoopHeaderPhiBuilder
// Phase 200-2: Use JoinInlineBoundaryBuilder for clean construction
use crate::mir::join_ir::lowering::JoinInlineBoundaryBuilder;
let boundary = JoinInlineBoundaryBuilder::new()
.with_inputs(
vec![ValueId(0)], // JoinIR's main() parameter (loop variable init)
vec![loop_var_id], // Host's loop variable
)
.with_condition_bindings(condition_bindings)
.with_exit_bindings(exit_bindings.clone())
.with_expr_result(fragment_meta.expr_result) // Phase 33-14: Pass expr_result to merger
.with_loop_var_name(Some(loop_var_name.clone())) // Phase 33-16: For LoopHeaderPhiBuilder
.build();
// Phase 33-22: Use JoinIRConversionPipeline for unified conversion flow
use super::conversion_pipeline::JoinIRConversionPipeline;