- Task 201-1: Established canonical Builder pattern documentation - Created docs/development/current/main/joinir-boundary-builder-pattern.md - Documented Builder usage patterns for all patterns (P1/P2/P3/P4) - Added reference comments in pattern lowerers - Task 201-2: Refactored Pattern3 to use Builder (removed field mutations) - Replaced new_with_exit_bindings + field mutation with Builder chain - Pattern3: 2 carriers (i + sum), exit_bindings, loop_var_name - Proper LoopExitBinding struct usage - Task 201-3: Refactored Pattern4 to use Builder (continue/Trim support) - Replaced new_with_exit_bindings + field mutation with Builder chain - Pattern4: Dynamic carrier count, proper boundary construction - Task 201-4: Added unit tests for Pattern3/4 style boundaries - test_builder_pattern3_style: Two carriers, exit_bindings validation - test_builder_pattern4_style: Dynamic carrier count validation - Verified no field mutations remain (exit_binding.rs uses deprecated fields only) - Task 201-5: Updated architecture docs and CURRENT_TASK - joinir-architecture-overview.md: Builder now applied to all patterns - CURRENT_TASK.md: Phase 201 completion entry All patterns now use consistent boundary construction via Builder. Tests: All patterns pass (挙動不変).
2.9 KiB
2.9 KiB
JoinInlineBoundaryBuilder 使用パターン(Phase 201)
Pattern2 の Canonical 形式
Pattern2 で確立した Builder 使用パターンを他の Pattern に適用する際の基準。
Builder 構築順序
let boundary = JoinInlineBoundaryBuilder::new()
.with_inputs(join_inputs, host_inputs)
.with_condition_bindings(condition_bindings)
.with_exit_bindings(exit_bindings)
.with_loop_var_name(Some(loop_var_name.clone()))
.with_expr_result(fragment_meta.expr_result)
.build();
各メソッドの意味
-
with_inputs(join_inputs, host_inputs)
- ループパラメータの橋渡し
- join_inputs: JoinIR 側の ValueId リスト
- host_inputs: MIR 側の ValueId リスト
-
with_condition_bindings(bindings)
- 条件式専用変数の橋渡し
- ConditionBinding のリスト(変数名 + JoinIR ValueId のペア)
-
with_exit_bindings(bindings)
- キャリア出口の橋渡し
- (変数名, JoinIR ValueId) のペア
-
with_loop_var_name(name)
- ループ変数名(LoopHeader PHI 生成用)
- Some(変数名) または None
-
with_expr_result(expr)
- ループが式として返す値
- Some(ValueId) または None
フィールド直書き禁止
- ❌
boundary.loop_var_name = ...;等の直接代入は禁止 - ✅ Builder の fluent API のみ使用
Pattern別の使用パターン
Pattern2 (with break)
let boundary = JoinInlineBoundaryBuilder::new()
.with_inputs(vec![ValueId(0)], vec![loop_var_id])
.with_condition_bindings(condition_bindings)
.with_exit_bindings(exit_bindings)
.with_loop_var_name(Some(loop_var_name.clone()))
.with_expr_result(fragment_meta.expr_result)
.build();
Pattern3 (with if-phi)
let boundary = JoinInlineBoundaryBuilder::new()
.with_inputs(
vec![ValueId(0), ValueId(1)], // i, sum
vec![loop_var_id, sum_var_id],
)
.with_exit_bindings(vec![
("sum".to_string(), ValueId(18))
])
.with_loop_var_name(Some(loop_var_name.clone()))
.build();
Pattern4 (with continue)
let boundary = JoinInlineBoundaryBuilder::new()
.with_inputs(join_inputs, host_inputs) // Dynamic carrier count
.with_exit_bindings(exit_bindings)
.with_loop_var_name(Some(loop_var_name.clone()))
.build();
Phase 201 目標
- ✅ Pattern2/3/4 全てで Builder 使用に統一
- ✅ フィールド直書き(
boundary.field = value;)完全排除 - ✅ 境界情報の組み立てを 1 箇所(Builder)に集約
- ✅ テスト全 PASS(挙動不変)
実装ファイル
- Builder 本体:
src/mir/join_ir/lowering/inline_boundary_builder.rs - Pattern2:
src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs - Pattern3:
src/mir/builder/control_flow/joinir/patterns/pattern3_with_if_phi.rs - Pattern4:
src/mir/builder/control_flow/joinir/patterns/pattern4_with_continue.rs