Files
hakorune/docs/development/current/main/phases/phase-284
tomoaki 41d92bedb9 refactor(extractors): Phase 282 P9a - CommonExtractionHelpers SSOT統合(スコープ限定版)
# Phase 282 P9a 完了 (Scope-Limited Integration)

## 実装内容
- **common_helpers.rs 作成**: 4グループの共通ヘルパー統合 (316行)
  - Group 1: Control Flow Counting (count_control_flow - 汎用カウンター)
  - Group 2: Control Flow Detection (has_break/continue/return_statement)
  - Group 3: Condition Validation (extract_loop_variable, is_true_literal)
  - Group 4: Pattern5専用ヘルパー (validate_continue_at_end, validate_break_in_simple_if)

- **Pattern統合完了**: Pattern5 → Pattern4 → Pattern2 → Pattern1
  - Pattern5: ~90行削減 (5 tests PASS)
  - Pattern4: ~66行削減 (5 tests PASS)
  - Pattern2: ~67行削減 (4 tests PASS)
  - Pattern1: ~28行削減 (3 tests PASS)
  - Pattern3: 別フェーズに延期(pattern固有ロジック除外)

## 成果
- **コード削減**: ~251行(Pattern3除く、total ~400行見込み)
- **テスト**: 40 unit tests PASS (23 common_helpers + 17 extractors)
- **スモークテスト**: 45 PASS, 1 pre-existing FAIL(退行ゼロ)
- **ビルド警告**: 130 → 120 (-10)

## USER CORRECTIONS適用済み
1.  スコープ限定(共通ロジックのみ、pattern固有除外)
2.  Placeholder禁止(SSOT違反排除)
3.  統合順序変更(Pattern3を最後/別フェーズへ)

## 追加ドキュメント
- Phase 284 計画追加(Return as ExitKind SSOT)
- 10-Now.md, 30-Backlog.md 更新

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 11:14:28 +09:00
..

Phase 284: Return as ExitKind SSOTpatternに散らさない

Status: Planned (design-first)

Goal

return を “pattern 個別の特例” として増やさず、ExitKind::Returncompose::* / emit_frag() に収束させる。 移行期間中の検出穴Ok(None) による黙殺を消し、Fail-Fast を構造で担保する。

SSOT References

  • Frag/ExitKind 設計: docs/development/current/main/design/edgecfg-fragments.md
  • Composition API: src/mir/builder/control_flow/edgecfg/api/compose.rs
  • Terminator emission: src/mir/builder/control_flow/edgecfg/api/emit.rsemit_frag()
  • Router SSOTSSOT=extract / safety valve: docs/development/current/main/phases/phase-282/README.md

Problem移行期間の弱さ

  • Pattern 単位で return を “未対応” にすると、検出戦略Ok(None)/Err次第で 静かに別経路へ落ちる
  • その結果、同じソースでも「どの lowering が return を解釈したか」が曖昧になり、SSOT が割れる。

Core SSOT決めること

1) 返り値の意味ExitKind

  • return exprExitKind::Return として表現する。
  • 返り値ValueIdEdgeArgs で運ぶReturn edge が value を持つ)。
  • Return は 必ず emit 側で terminator になるpattern 側で命令を直に生成しない)。

2) Detect の境界Ok(None) / Err

  • Ok(None): 一致しない(次の extractor へ)
  • Err(...): 一致したが未対応close-but-unsupportedFail-Fast

Phase 284 の完了条件は「return を含むケースが close-but-unsupported ではなく SSOT 経路で処理される」状態に寄せること。

3) 実装の集約点(どこに寄せるか)

  • return の lowering は ExitKind + compose + emit_frag に集約する。
  • pattern の extractor は “認識” のみSSOT=extractreturn の解釈ロジックを増やさない。

Scope

P0docs-only

  • return を ExitKind として扱う SSOT を文章で固定する(本ファイル + 参照先リンク)。
  • 移行期間のルールOk(None)/Err の境界、黙殺禁止)を Phase 282 と整合させる。

P1+code

  • return を含む loop body を、JoinIR/Plan のどちらの経路でも 同じ ExitKind::Return に落とす。
  • VM/LLVM の両方で、return を含む fixture を smoke 化して SSOT を固定する。

Acceptance

  • P0: return の SSOTExitKind/compose/emitと detect 境界が明文化されている
  • P1+: return を含む loop fixture が VM/LLVM で同一結果になり、smoke で固定されている