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:
@ -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-19:Phase 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 を deprecated(4 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-19:Phase 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 A(SSOT化): `KnownIntrinsicRegistryBox` を追加し、intrinsic の metadata(name/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-19:Phase 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-19:Phase 141 P0 完了 ✅
|
||||
|
||||
**Phase 141 P0: Impure Extension Contract (Call/MethodCall stays out-of-scope)**
|
||||
- 目的: 次フェーズの Call/MethodCall 導入に向けて、pure/impure 境界の contract(SSOT)を型で固定
|
||||
- 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-19:Phase 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-19:Phase 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-18:Phase 138 完了 ✅
|
||||
|
||||
**Phase 138: ReturnValueLowererBox - Return Lowering SSOT**
|
||||
|
||||
Reference in New Issue
Block a user