## Summary
skip_whitespace パターンを Skeleton→Decision で認識可能に。
dev-only 観測で chosen=Pattern3IfPhi / missing_caps=[] を固定。
## Changes
- src/mir/loop_canonicalizer/mod.rs:
- try_extract_skip_whitespace_pattern() 追加
- loop(cond) { ... if check { p = p + 1 } else { break } } パターン認識
- carrier name, delta, body statements を抽出
- canonicalize_loop_expr() 拡張(skip_whitespace 対応)
- Pattern3IfPhi 成功時は RoutingDecision::success 返却
- Skeleton に HeaderCond, Body, Update ステップ追加
- CarrierSlot に Counter role 設定
- ExitContract に has_break=true 設定
- Phase 3 unit tests 追加
- test_skip_whitespace_pattern_recognition: 基本パターン
- test_skip_whitespace_with_body_statements: body 付きパターン
- test_skip_whitespace_fails_without_else: else なし失敗
- test_skip_whitespace_fails_with_wrong_delta: 減算パターン失敗
- Phase 2 obsolete tests 削除
- src/mir/builder/control_flow/joinir/routing.rs:
- Debug 出力拡張(chosen pattern 表示)
## Tests
- cargo test --release --lib loop_canonicalizer::tests: PASS(11 tests)
- cargo test --release --lib: PASS(1044 tests, 退行なし)
- HAKO_JOINIR_DEBUG=1 test_pattern3_skip_whitespace.hako:
- chosen=Pattern3IfPhi ✅
- missing_caps=[] ✅
## Validation
- ✅ dev-only 観測(HAKO_JOINIR_DEBUG=1)のときだけログ出力
- ✅ フラグ OFF 時は完全不変
- ✅ skip_whitespace パターンで SUCCESS 固定
- ✅ unit tests で全パターン固定
Phase 137-3 complete
1.5 KiB
1.5 KiB
Phase 137: Loop Canonicalizer(前処理 SSOT)
Status
- 状態: 🔶 進行中(Phase 2 完了)
Goal
- ループ形の組み合わせ爆発を抑えるため、
AST → LoopSkeleton → (capability/routing)の前処理を SSOT 化する。 - 既存の方針(fixture + shape guard + Fail-Fast)を維持したまま、pattern 数を増やさずにスケールさせる。
Phase 1(完了): 型/語彙の SSOT
- 実装:
src/mir/loop_canonicalizer/mod.rsLoopSkeleton/SkeletonStep/UpdateKindExitContract/CarrierSlot/CarrierRoleRoutingDecision/ capability tags(CAP_MISSING_*)
- 注意: Phase 1 は「型と語彙」のみ。routing/lowering にはまだ介入しない。
Phase 2(完了): dev-only 観測の導入
- 入口:
- Canonicalize:
src/mir/loop_canonicalizer/mod.rs(canonicalize_loop_expr) - 観測ポイント:
src/mir/builder/control_flow/joinir/routing.rs(joinir_dev_enabled()配下)
- Canonicalize:
- 既定挙動: 不変(dev-only 観測のみ)
Phase 3(次): Pattern 検出(Skeleton→Decision の精密化)
- 目標:
skip_whitespaceを Skeleton から安定に識別し、RoutingDecision.chosenとmissing_capsを期待通りに固定する。 - 注意: routing/lowering の変更は dev-only の観測結果が固まってから。
SSOT
- 設計 SSOT:
docs/development/current/main/design/loop-canonicalizer.md - JoinIR 契約 SSOT:
docs/development/current/main/joinir-architecture-overview.md