# Phase 200-C: digits.indexOf E2E 連携
**Date**: 2025-12-09
**Status**: Ready for Implementation
**Prerequisite**: Phase 200-A/B complete
---
## ゴール
1. **PatternPipelineContext / LoopPatternContext に fn_body(関数全体 AST)を通す**
2. **Pattern 2 で FunctionScopeCaptureAnalyzer を実際に呼び出す**
3. **digits.indexOf(ch) を含む最小ループを JoinIR 経由で最後まで動かす**
**成功基準**:
- `phase200_digits_atoi_min.hako` が正しい結果(123)を出力
- `phase200_digits_parse_number_min.hako` が正しい結果("42")を出力
---
## Task 200-C-1: LoopPatternContext に fn_body を追加
### 対象ファイル
- `src/mir/builder/control_flow/joinir/patterns/router.rs`
- `src/mir/builder/control_flow/joinir/routing.rs`
### 実装内容
#### 1. LoopPatternContext 拡張
```rust
// router.rs
pub struct LoopPatternContext<'a> {
// 既存フィールド
pub condition: &'a ASTNode,
pub body: &'a [ASTNode],
pub func_name: &'a str,
pub debug: bool,
pub has_continue: bool,
pub has_break: bool,
pub features: LoopFeatures,
pub pattern_kind: LoopPatternKind,
// Phase 200-C: NEW - 関数全体の AST
pub fn_body: Option<&'a [ASTNode]>,
}
impl<'a> LoopPatternContext<'a> {
pub fn new(
condition: &'a ASTNode,
body: &'a [ASTNode],
func_name: &'a str,
debug: bool,
) -> Self {
// 既存コード...
Self {
// ...
fn_body: None, // Phase 200-C: Default to None
}
}
/// Phase 200-C: Create context with fn_body for capture analysis
pub fn with_fn_body(
condition: &'a ASTNode,
body: &'a [ASTNode],
func_name: &'a str,
debug: bool,
fn_body: &'a [ASTNode],
) -> Self {
let mut ctx = Self::new(condition, body, func_name, debug);
ctx.fn_body = Some(fn_body);
ctx
}
}
```
#### 2. routing.rs から fn_body を渡す
```rust
// routing.rs - cf_loop_joinir_impl()
pub(in crate::mir::builder) fn cf_loop_joinir_impl(
&mut self,
condition: &ASTNode,
body: &[ASTNode],
func_name: &str,
debug: bool,
) -> Result