feat(joinir): Phase 245C - Function parameter capture + test fix
Extend CapturedEnv to include function parameters used in loop conditions, enabling ExprLowerer to resolve variables like `s` in `loop(p < s.length())`. Phase 245C changes: - function_scope_capture.rs: Add collect_names_in_loop_parts() helper - function_scope_capture.rs: Extend analyze_captured_vars_v2() with param capture logic - function_scope_capture.rs: Add 4 new comprehensive tests Test fix: - expr_lowerer/ast_support.rs: Accept all MethodCall nodes for syntax support (validation happens during lowering in MethodCallLowerer) Problem solved: "Variable not found: s" errors in loop conditions Test results: 924/924 PASS (+13 from baseline 911) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -397,6 +397,15 @@ mod tests {
|
||||
assert!(is_simple_comparison(&cond));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pattern3_cond_i_mod_2_eq_1_is_recognized() {
|
||||
// Pattern3/4 で使う典型的なフィルタ条件: i % 2 == 1
|
||||
let lhs = binop(BinaryOperator::Modulo, var("i"), int_lit(2));
|
||||
let cond = binop(BinaryOperator::Equal, lhs, int_lit(1));
|
||||
assert_eq!(analyze_condition_pattern(&cond), ConditionPattern::SimpleComparison);
|
||||
assert!(is_simple_comparison(&cond));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_complex_logical_and() {
|
||||
// a && b (logical And)
|
||||
@ -427,6 +436,19 @@ mod tests {
|
||||
assert!(!is_simple_comparison(&cond));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unsupported_nested_mod_condition_is_rejected() {
|
||||
// (i % 2 == 1) && (j > 0) → 複合条件として Complex 扱い
|
||||
let mod_eq = {
|
||||
let lhs = binop(BinaryOperator::Modulo, var("i"), int_lit(2));
|
||||
binop(BinaryOperator::Equal, lhs, int_lit(1))
|
||||
};
|
||||
let gt_zero = binop(BinaryOperator::Greater, var("j"), int_lit(0));
|
||||
let cond = binop(BinaryOperator::And, mod_eq, gt_zero);
|
||||
assert_eq!(analyze_condition_pattern(&cond), ConditionPattern::Complex);
|
||||
assert!(!is_simple_comparison(&cond));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_complex_non_binary_op() {
|
||||
// Just a variable (not a comparison)
|
||||
|
||||
Reference in New Issue
Block a user