feat(joinir): Phase 286 P2.3 + Phase 287 - Pattern9 Plan化 + Router table-driven
## Phase 286 P2.3: Pattern9 AccumConstLoop Plan化 PoC - DomainPlan::Pattern9AccumConstLoop 追加 - PlanNormalizer::normalize_pattern9_accum_const_loop() 実装 - PHI 2本(loop_var, acc_var) - const/var 両方 OK(sum = sum + 1 または sum = sum + i) - Pattern9 は Pattern1 より優先(より具体的なパターン) - Integration test: phase286_pattern9_frag_poc PASS (return: 3) - Regression: quick 154 PASS ## Phase 287: Router table-driven Plan extraction - PLAN_EXTRACTORS static table で Pattern6/7/4/9/1 を統一管理 - PlanExtractorEntry/PlanExtractorVariant 構造体追加 - try_plan_extractors() で ~100行 → 3行に集約 - メンテナンス性向上(新 Pattern 追加はテーブル1行追加のみ) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -8,12 +8,12 @@ Related:
|
||||
|
||||
## 直近(JoinIR/selfhost)
|
||||
|
||||
- **Phase 288(✅ P0–P3 complete): REPL mode**
|
||||
- **Phase 288(✅ P0–P3 + 288.1 complete): REPL mode**
|
||||
- 入口: `docs/development/current/main/phases/phase-288/README.md`
|
||||
- SSOT: `docs/reference/language/repl.md`
|
||||
- 次: Phase 288.1(session persistence / auto-display) `docs/development/current/main/phases/phase-288/P1-INSTRUCTIONS.md`
|
||||
- 次: Phase 288.2+(任意): REPL UX improvements(history / multiline / load 等)
|
||||
|
||||
- **Phase 287(active, stabilization): ビルド/テスト軽量化(quick が重すぎる)**
|
||||
- **Phase 287(✅ complete): ビルド/テスト軽量化(quick gate の責務分離)**
|
||||
- 目的: `tools/smokes/v2/run.sh --profile quick` を 45秒以内(目安)へ戻し、開発サイクルを軽くする
|
||||
- 入口: `docs/development/current/main/phases/phase-287/README.md`
|
||||
- 手順: `docs/development/current/main/phases/phase-287/P1-INSTRUCTIONS.md`
|
||||
@ -64,6 +64,7 @@ Related:
|
||||
- ねらい: `return/break/continue` のような “大きな出口語彙” の実装場所が揺れない状態にする
|
||||
- 入口: `docs/development/current/main/phases/phase-286/README.md`
|
||||
- P0(docs-only): `docs/development/current/main/phases/phase-286/P0-INSTRUCTIONS.md`
|
||||
- 状況: P2(Pattern4 PoC)/P2.1(Pattern1 PoC)完了。次は P2.2(hygiene)→ P2.3(Pattern2 Plan化の再開条件が揃えば)
|
||||
- SSOT:
|
||||
- Plan/Frag: `compose::*` + `emit_frag()`(Phase 280/281)
|
||||
- JoinIR line 共通入口: `src/mir/builder/control_flow/joinir/patterns/conversion_pipeline.rs`
|
||||
|
||||
@ -900,6 +900,11 @@ Pattern6/7 は **Plan line(Extractor → Normalizer → Verifier → Lowerer
|
||||
- 許可: `UpdateRhs::Const`, `UpdateRhs::Variable`, `UpdateRhs::StringLiteral`
|
||||
- 拒否: `UpdateRhs::Other`(method call / nested BinOp 等の複雑パターンのみ)
|
||||
- Pattern2/4 の can_lower() で選別、carrier_update_emitter.rs で JoinIR 生成
|
||||
- 現状制約(重要 / PoC の前提):
|
||||
- Pattern2 の「出口で値が持ち帰られる変数」は、基本的に **carrier として認識されたもの**のみが `exit_bindings` 経由で再接続される。
|
||||
- 現状の carrier 認識は “mutable-acc” 形(例: `result = result + rhs`)を中心に成立しており、`result = 42` のような **direct assignment** は carrier として扱われないケースがある。
|
||||
- その場合、break 後に `return result` しても「ループ前の値」が返りうる(再接続されないため)。
|
||||
- Phase 286 P2 の PoC fixture は、この制約を踏んで **mutable-acc 形で固定**する(direct assignment 対応は別フェーズで箱化して拡張する)。
|
||||
|
||||
- **ExitMeta / JoinFragmentMeta**
|
||||
- ファイル: `carrier_info.rs`
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# Phase 286: JoinIR Line Absorption(JoinIR→CorePlan/Frag 収束)
|
||||
|
||||
Status: In Progress (P0, P1, P2, P3, 286C-2 COMPLETE)
|
||||
Status: In Progress (P0, P1, P2, P2.1, P2.2, P2.3, P3, 286C-2 COMPLETE)
|
||||
|
||||
## Goal
|
||||
|
||||
@ -147,6 +147,33 @@ Phase 286 では JoinIR line を “第2の lowerer” として放置せず、*
|
||||
- Regression test: quick smoke 154 PASS
|
||||
- Pattern1 PoC: PASS, Pattern4 PoC: PASS
|
||||
|
||||
### P2.3 (Pattern9 AccumConstLoop Plan化 PoC) ✅ COMPLETE (2025-12-26)
|
||||
|
||||
**完了内容**:
|
||||
- **Pattern9 (AccumConstLoop) を Plan/Frag SSOT に移行**
|
||||
- DomainPlan::Pattern9AccumConstLoop 追加
|
||||
- PlanNormalizer::normalize_pattern9_accum_const_loop() 実装(PHI 2本: loop_var, acc_var)
|
||||
- Router integration(Plan line routing → legacy fallback)
|
||||
- Pattern9 は Pattern1 より優先(より具体的なパターン)
|
||||
|
||||
**設計決定**:
|
||||
- **PoC は const/var 両方 OK**: `sum = sum + 1`(定数)または `sum = sum + i`(変数)
|
||||
- **本体の順序固定**: 1行目=累積更新, 2行目=ループ変数更新
|
||||
- **CFG 構造**: Pattern1 と同じ骨格、PHI 2本(i_current, sum_current)
|
||||
|
||||
**成果物**:
|
||||
- `apps/tests/phase286_pattern9_frag_poc.hako` (最小fixture: const accumulation)
|
||||
- `tools/smokes/v2/profiles/integration/apps/phase286_pattern9_frag_poc.sh` (integration smoke)
|
||||
- `src/mir/builder/control_flow/plan/mod.rs` (Pattern9AccumConstLoopPlan + DomainPlan variant)
|
||||
- `src/mir/builder/control_flow/joinir/patterns/extractors/pattern9.rs` (extract_pattern9_plan() 新規)
|
||||
- `src/mir/builder/control_flow/joinir/patterns/extractors/mod.rs` (pattern9 モジュール追加)
|
||||
- `src/mir/builder/control_flow/plan/normalizer.rs` (normalize_pattern9_accum_const_loop())
|
||||
- `src/mir/builder/control_flow/joinir/patterns/router.rs` (Pattern9 Plan line routing)
|
||||
|
||||
**検証結果**:
|
||||
- Integration test: `phase286_pattern9_frag_poc` PASS (return: 3)
|
||||
- Regression test: quick smoke 154 PASS, 0 FAILED
|
||||
|
||||
### P3 (error context enrichment) ✅ COMPLETE (2025-12-25)
|
||||
|
||||
**完了内容**:
|
||||
|
||||
Reference in New Issue
Block a user