feat(joinir): Phase 200-B/C/D capture analysis + Phase 201-A reserved_value_ids infra
Phase 200-B: FunctionScopeCaptureAnalyzer implementation - analyze_captured_vars_v2() with structural loop matching - CapturedEnv for immutable function-scope variables - ParamRole::Condition for condition-only variables Phase 200-C: ConditionEnvBuilder extension - build_with_captures() integrates CapturedEnv into ConditionEnv - fn_body propagation through LoopPatternContext to Pattern 2 Phase 200-D: E2E verification - capture detection working for base, limit, n etc. - Test files: phase200d_capture_minimal.hako, phase200d_capture_in_condition.hako Phase 201-A: MirBuilder reserved_value_ids infrastructure - reserved_value_ids: HashSet<ValueId> field in MirBuilder - next_value_id() skips reserved IDs - merge/mod.rs sets/clears reserved IDs around JoinIR merge Phase 201: JoinValueSpace design document - Param/Local/PHI disjoint regions design - API: alloc_param(), alloc_local(), reserve_phi() - Migration plan for Pattern 1-4 lowerers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -54,6 +54,10 @@ pub struct LoopPatternContext<'a> {
|
||||
|
||||
/// Phase 192: Pattern classification based on features
|
||||
pub pattern_kind: LoopPatternKind,
|
||||
|
||||
/// Phase 200-C: Optional function body AST for capture analysis
|
||||
/// None if not available, Some(&[ASTNode]) if function body is accessible
|
||||
pub fn_body: Option<&'a [ASTNode]>,
|
||||
}
|
||||
|
||||
impl<'a> LoopPatternContext<'a> {
|
||||
@ -87,8 +91,22 @@ impl<'a> LoopPatternContext<'a> {
|
||||
has_break,
|
||||
features,
|
||||
pattern_kind,
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
/// Phase 193: Feature extraction moved to ast_feature_extractor module
|
||||
|
||||
Reference in New Issue
Block a user