- P2: Create loop_patterns/ module structure - common.rs: shared helpers (ParsedProgram, LoopContext, etc.) - simple.rs: generic loop lowering - filter.rs, print_tokens.rs: delegate to simple - break_pattern.rs, continue_pattern.rs: new modules - P3: Create LoopFrontendBinding layer - Separate function name detection from pattern lowering - detect_loop_pattern() for pattern classification - P4: Break/Continue pattern migration - Move Break/Continue handling from loop_patterns_old.rs - Add LoopPattern::Break and LoopPattern::Continue variants - Design: 3-layer architecture - LoopFrontendBinding: function name → LoopPattern - loop_patterns: LoopPattern → JoinIR - Bridge/VM: Box semantics All 56 JoinIR tests pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6.4 KiB
6.4 KiB
Phase P2: Loop Pattern enum化 実装計画書
目次
1. 現状分析
1.1 対象ファイル概要
ファイル: src/mir/join_ir/frontend/ast_lowerer/loop_patterns.rs
行数: 895行
主要関数:
lower_loop_with_break_continue()(43行) - ディスパッチャーlower_loop_case_a_simple()(329行) - Simple patternlower_loop_break_pattern()(202行) - Break patternlower_loop_continue_pattern()(241行) - Continue pattern
1.2 ループパターンの分類
| パターン | 条件 | 関数 | 行数 | 複雑度 |
|---|---|---|---|---|
| Simple | !has_break && !has_continue |
lower_loop_case_a_simple() |
329 | 高 |
| Break | has_break && !has_continue |
lower_loop_break_pattern() |
202 | 中 |
| Continue | has_continue && !has_break |
lower_loop_continue_pattern() |
241 | 中 |
| Mixed | has_break && has_continue |
panic! | 0 | 未実装 |
1.3 P1 との比較
| 項目 | P1 (If Handler) | P2 (Loop Patterns) |
|---|---|---|
| 対象ファイル | stmt_handlers.rs |
loop_patterns.rs |
| 元の行数 | 154行 | 895行 |
| パターン数 | 5個 | 4個(1個未実装) |
| 最大パターン | 57行 | 329行 |
| 共通処理 | 少ない | 多い(~85行) |
2. LoopPattern enum 設計案
/// ループパターンの分類
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum LoopPattern {
/// Simple pattern: 条件付きループ(break/continue なし)
Simple {
cond_expr: Value,
has_me: bool,
external_refs: Vec<(String, ValueId)>,
},
/// Break pattern: 早期 return ループ
Break {
break_cond_expr: Value,
},
/// Continue pattern: 条件付きスキップループ
Continue {
loop_cond_expr: Value,
continue_cond_expr: Value,
},
/// Mixed pattern: break と continue 両方(未実装)
Mixed {
_marker: (),
},
}
3. モジュール構造案
src/mir/join_ir/frontend/ast_lowerer/
├── loop_patterns.rs (縮小版: ~60行)
└── loop_patterns/
├── mod.rs (~50行)
├── pattern.rs (~180行) - パターン検出ロジック
├── common.rs (~150行) - 共通処理ヘルパー
├── lowering/
│ ├── mod.rs (~30行)
│ ├── simple.rs (~180行)
│ ├── break_pattern.rs (~120行)
│ ├── continue_pattern.rs (~140行)
│ └── mixed.rs (~30行)
└── tests.rs (~150行)
4. 削減見込み
| カテゴリ | Before | After | 削減 | 削減率 |
|---|---|---|---|---|
| loop_patterns.rs | 895 | 60 | -835 | -93.3% |
| 新規モジュール | 0 | 1,090 | +1,090 | - |
| 純増減 | 895 | 1,150 | +255 | +28.5% |
P1 との比較
| 項目 | P1 (If Handler) | P2 (Loop Patterns) |
|---|---|---|
| 削減率 | 93.5% | 93.3% |
| 新規コスト | +336行 (+218%) | +255行 (+28.5%) |
P2 の優位性: 共通処理の再利用により、新規コストが P1 より効率的
5. 実装ステップ
Step 1: 基礎インフラ構築(3-4時間)
- ディレクトリ構造作成
loop_patterns/mod.rs作成loop_patterns/pattern.rs実装(LoopPattern enum + 検出ロジック)loop_patterns/common.rs実装(共通処理ヘルパー)
Step 2: 各パターン lowering 実装(6-8時間)
- Break pattern (2時間)
- Continue pattern (2.5時間)
- Simple pattern (3時間) - 最複雑
- Mixed pattern (0.5時間)
- lowering/mod.rs 統合 (1時間)
Step 3: loop_patterns.rs リファクタリング(1-2時間)
- 895行 → 60行に削減
- パターン検出 → lowering 委譲
Step 4: テスト追加(2-3時間)
- パターン検出テスト: 10個
- 共通処理テスト: 5個
- lowering テスト: 12個
- 統合テスト: 5個
Step 5: 統合・検証(1-2時間)
- 既存テスト全通過
- 回帰テスト(11個の .hako ファイル)
総推定時間: 13-19時間
6. リスク評価
6.1 P1 より複雑な点
-
Simple pattern の複雑性
- me/external_refs の動的パラメータ計算
- P1 最大57行 vs P2 最大329行(5.8倍)
-
共通処理の量
- 3関数構造生成(entry/loop_step/k_exit)
- P1: 共通処理ほぼなし vs P2: 150行
-
Phase 52/56 機能の保持
- me パラメータ対応
- external_refs 対応(filter/map)
6.2 回避策
環境変数制御による段階的移行(P1 と同じ戦略)
7. テスト戦略
7.1 回帰テストリスト
# 基本ループ
apps/tests/loop_min_while.hako
apps/tests/joinir_min_loop.hako
# Break pattern
apps/tests/loopform_break_and_return.hako
apps/tests/nested_loop_inner_break_isolated.hako
# Continue pattern
apps/tests/loop-continue-demo/main.hako
apps/tests/loopform_continue_break_scan.hako
8. チェックリスト
基礎インフラ (Step 1)
- ディレクトリ構造作成完了
loop_patterns/mod.rs作成完了loop_patterns/pattern.rs実装完了loop_patterns/common.rs実装完了
パターン lowering (Step 2)
lowering/break_pattern.rs実装完了lowering/continue_pattern.rs実装完了lowering/simple.rs実装完了lowering/mixed.rs実装完了
リファクタリング (Step 3)
loop_patterns.rs修正完了(895行 → 60行)- 既存テスト全通過
テスト (Step 4)
- パターン検出テスト(10個)
- 共通処理テスト(5個)
- lowering テスト(12個)
統合・検証 (Step 5)
- 全ユニットテスト通過
- 既存回帰テスト通過
- パフォーマンス劣化なし
作成日: 2025-11-29 Phase: P2 (Loop Pattern enum化) 前提: P1 (If Handler 箱化モジュール化) 完了 作成者: Claude Code + Task agent (Plan mode)