feat(normalization): Phase 142 P0 - Loop statement-level normalization

Phase 142-loopstmt P0: Statement-level normalization

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-19 05:28:49 +09:00
parent 275fe45ba4
commit 4082abb30c
23 changed files with 1610 additions and 246 deletions

View File

@ -1,5 +1,104 @@
# Self Current Task — Now (main)
## Next (planned)
- Phase 142-loopstmt P1: LLVM EXE smoke test 追加Phase 130 完了後)
- Phase 141 P2+: Call/MethodCall 対応effects + typing を分離して段階投入)
- Phase 143-loopvocab: StepTree の語彙拡張loop 内 if/break/continue を「新パターン追加」ではなく「語彙追加」で吸収)
- 詳細: `docs/development/current/main/30-Backlog.md`
## 2025-12-19Phase 142-loopstmt P0 完了 ✅
**Phase 142-loopstmt P0: Statement-Level Loop Normalization**
- 目的: 正規化単位を "block suffix" から "statement (loop 1個)" へ寄せてパターン爆発を防ぐ
- 変更:
- PlanBox: loop(true) に対して常に loop_only() を返すconsumed=1
- SuffixRouter: LoopOnly を受け入れて実行
- build_block: consumed 後も後続文を処理break 削除)
- 実装 SSOT:
- `src/mir/builder/control_flow/normalization/plan_box.rs`
- `src/mir/builder/control_flow/joinir/patterns/policies/normalized_shadow_suffix_router_box.rs`
- `src/mir/builder/stmts.rs`
- Refactoring:
- LoopWithPost variant を deprecated4 commits
- suffix_router コメント更新
- README 更新
- Tests:
- Fixture: `apps/tests/phase142_loop_stmt_only_then_return_length_min.hako`exit code 3
- VM smoke: ✅ PASS
- Unit tests: ✅ 10/10 passed
- Regression: ✅ Phase 131, 141 green
- 統計: -38 lines net (code reduction success!)
- 入口: `docs/development/current/main/phases/phase-142-loopstmt/README.md`
⚠️ **Note**: Phase 142 (Canonicalizer Pattern Extension) とは別物。SSOT 衝突回避のため phase-142-loopstmt として独立管理。
## 2025-12-19Phase 141 P1.5 完了 ✅
**Phase 141 P1.5: KnownIntrinsic registry + available_inputs 3-source merge + diagnostics**
- 目的: “既知 intrinsic だけ” を SSOT 化しつつ、suffix 正規化が prefix の変数を見失わないようにする(既定挙動不変)。
- Task Bバグ修正: `AvailableInputsCollectorBox::collect(.., prefix_variables)` を追加し、Function params > Prefix variables > CapturedEnv の 3-source merge に変更
- Task ASSOT化: `KnownIntrinsicRegistryBox` を追加し、intrinsic の metadataname/arity/type_hint`known_intrinsics.rs` に集約
- Task C診断: `OutOfScopeReason::IntrinsicNotWhitelisted` を追加し、Call/MethodCall の out-of-scope 理由を精密化
- 実装 SSOT:
- `src/mir/control_tree/normalized_shadow/available_inputs_collector.rs`
- `src/mir/control_tree/normalized_shadow/common/known_intrinsics.rs`
- `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs`
- `src/mir/control_tree/normalized_shadow/common/expr_lowering_contract.rs`
- `src/mir/builder/control_flow/normalization/execute_box.rs`
- 設計 SSOT:
- `docs/development/current/main/design/normalized-expr-lowering.md`
## 2025-12-19Phase 141 P1 完了 ✅
**Phase 141 P1: KnownIntrinsicOnly (length0)**
- 目的: impure 導入の安全なオンランプとして、既知 intrinsic小さな allowlistのみを ExprLowerer に追加
- 仕様:
- `ExprLoweringScope::WithImpure(ImpurePolicy::KnownIntrinsicOnly)` でのみ `receiver.length()` を lowering
- それ以外の Call/MethodCall は引き続き `Ok(None)`(既定挙動不変)
- Fixture:
- `apps/tests/phase141_p1_if_only_post_k_return_length_min.hako`expected exit code 3
- Smoke tests:
- VM: `tools/smokes/v2/profiles/integration/apps/phase141_p1_if_only_post_k_return_length_vm.sh`
- LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase141_p1_if_only_post_k_return_length_llvm_exe.sh`
- 入口: `docs/development/current/main/phases/phase-141/README.md`
## 2025-12-19Phase 141 P0 完了 ✅
**Phase 141 P0: Impure Extension Contract (Call/MethodCall stays out-of-scope)**
- 目的: 次フェーズの Call/MethodCall 導入に向けて、pure/impure 境界の contractSSOTを型で固定
- SSOT:
- `src/mir/control_tree/normalized_shadow/common/expr_lowering_contract.rs`
- `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs`
- 仕様: Call/MethodCall は引き続き `Ok(None)`(既定挙動不変)
- 入口: `docs/development/current/main/phases/phase-141/README.md`
## 2025-12-19Phase 140 完了 ✅
**Phase 140: NormalizedExprLowererBox (pure expressions)**
- 目的: “return の形追加” をやめて、pure expression を AST walker で一般化して収束させる
- SSOT:
- `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs`
- `src/mir/control_tree/normalized_shadow/common/return_value_lowerer_box.rs`
- 仕様:
- pure のみVariable / Integer&Bool literal / unary(not,-) / arith(+,-,*,/) / compare(==,!=,<,<=,>,>=)
- Call/MethodCall など impure は `Ok(None)`Phase 141+
- 入口: `docs/development/current/main/phases/phase-140/README.md`
## 2025-12-19Phase 139 完了 ✅
**Phase 139: post-if `post_k` Return Lowering Unification**
- 目的: if-only `post_k` 側の return lowering を `ReturnValueLowererBox` に統一し、loop/if の出口を一本化
- 実装:
- `src/mir/control_tree/normalized_shadow/post_if_post_k.rs` の return lowering を `ReturnValueLowererBox::lower_to_value_id()` に委譲
- out-of-scope は `Ok(None)` でフォールバック既定挙動不変・dev-only
- Fixture:
- `apps/tests/phase139_if_only_post_k_return_add_min.hako`expected exit code 4
- Smoke tests:
- VM: `tools/smokes/v2/profiles/integration/apps/phase139_if_only_post_k_return_add_vm.sh`
- LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase139_if_only_post_k_return_add_llvm_exe.sh`
- 入口: `docs/development/current/main/phases/phase-139/README.md`
## 2025-12-18Phase 138 完了 ✅
**Phase 138: ReturnValueLowererBox - Return Lowering SSOT**