Implements the Trim pattern detection logic for carrier promotion:
- find_definition_in_body(): Iterative AST traversal to locate variable definitions
- is_substring_method_call(): Detects substring() method calls
- extract_equality_literals(): Extracts string literals from OR chains (ch == " " || ch == "\t")
- TrimPatternInfo: Captures detected pattern details for carrier promotion
This enables Pattern 5 to detect trim-style loops:
```hako
loop(start < end) {
local ch = s.substring(start, start+1)
if ch == " " || ch == "\t" || ch == "\n" || ch == "\r" {
start = start + 1
} else {
break
}
}
```
Unit tests cover:
- Simple and nested definition detection
- substring method call detection
- Single and chained equality literal extraction
- Full Trim pattern detection with 2-4 whitespace characters
Next: Phase 171-C-3 integration with Pattern 2/4 routing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
6.9 KiB
Phase 170-D Bug Fix Verification - Summary Report
Date: 2025-12-07 Status: ✅ Bug Fix Verified and Documented Files Updated: 3 documentation files, 0 code changes (user implemented fix)
🎯 Executive Summary
The LoopConditionScopeBox function parameter misclassification bug has been successfully verified. Function parameters are now correctly classified as OuterLocal instead of being incorrectly treated as LoopBodyLocal.
Key Result: JsonParser loops now pass variable scope validation. Remaining errors are legitimate Pattern 5+ feature gaps (method calls), not bugs.
📊 Verification Results
✅ Test 1: Function Parameter Classification
Test File: /tmp/test_jsonparser_simple.hako
Loop: Pattern 2 with function parameters s and pos
Result:
✅ [joinir/pattern2] Phase 170-D: Condition variables verified: {"pos", "s", "len"}
⚠️ New error: MethodCall .substring() not supported (Pattern 5+ feature)
Analysis:
- ✅ Bug fix works:
sandposcorrectly classified as OuterLocal - ✅ No more misclassification errors: Variable scope validation passes
- ⚠️ Different blocker: Method calls in loop body (legitimate feature gap)
✅ Test 2: LoopBodyLocal Correct Rejection
Test File: local_tests/test_trim_main_pattern.hako
Loop: Pattern 2 with LoopBodyLocal ch in break condition
Result:
✅ [joinir/pattern2] Phase 170-D: Condition variables verified: {"ch", "end", "start"}
❌ [ERROR] Variable 'ch' not bound in ConditionEnv
Analysis:
- ✅ Correct rejection:
chis defined inside loop (local ch = ...) - ✅ Accurate error message: "Variable 'ch' not bound" (not misclassified)
- ✅ Expected behavior: Pattern 2 doesn't support LoopBodyLocal in break conditions
Conclusion: This is the correct rejection - not a bug, needs Pattern 5+ support.
✅ Test 3: JsonParser Full File
Test File: tools/hako_shared/json_parser.hako
Result:
❌ [ERROR] Unsupported expression in value context: MethodCall { ... }
Analysis:
- ✅ Variable classification working: No "incorrect variable scope" errors
- ⚠️ New blocker: Method calls in loop conditions (
s.length()) - ✅ Bug fix validated: JsonParser now hits different limitations (not variable scope bugs)
📁 Documentation Created
1. /home/tomoaki/git/hakorune-selfhost/docs/development/current/main/phase170-d-fix-verification.md ✅
Comprehensive verification report:
- Bug fix details (root cause + fix)
- Test results before/after (3 test cases)
- Pattern 1-4 coverage analysis
- Verification commands
- Impact assessment
- Next steps (Pattern 5+ implementation)
2. CURRENT_TASK.md Updated ✅
Added Section: "Bug Fix: Function Parameter Misclassification"
- Issue description
- Root cause
- Fix location (lines 175-184)
- Impact summary
- Link to verification doc
3. phase170-d-impl-design.md Updated ✅
Added Section: "Bug Fix: Function Parameter Misclassification (2025-12-07)"
- Detailed root cause analysis
- Before/after code comparison
- Impact assessment
- Test results
- Lessons learned
- Design principles
🔍 Bug Fix Technical Details
File: src/mir/loop_pattern_detection/condition_var_analyzer.rs
Lines: 175-184
The Fix (user implemented):
// At this point:
// - The variable is NOT in body_locals
// - There is no explicit definition info for it
//
// This typically means "function parameter" or "outer local"
// (e.g. JsonParserBox.s, .pos, etc.). Those should be treated
// as OuterLocal for condition analysis, otherwise we wrongly
// block valid loops as using loop-body-local variables.
true // ✅ Default to OuterLocal for function parameters
Key Insight: Unknown variables (not in variable_definitions) are typically function parameters or outer locals, not loop-body-locals. The fix defaults them to the safer (OuterLocal) classification.
📈 Impact Assessment
What the Fix Achieves ✅
- ✅ Function parameters work:
s,posin JsonParser methods - ✅ Carrier variables work:
start,endin trim loops - ✅ Outer locals work:
len,maxLenfrom outer scope - ✅ Correct rejection: LoopBodyLocal
chproperly rejected (not a bug)
What Still Needs Work ⚠️
Pattern 5+ Features (not bugs):
- Method calls in conditions:
loop(pos < s.length()) - Method calls in loop body:
s.substring(pos, pos+1) - LoopBodyLocal in break conditions:
if ch == " " { break }
Other Issues (orthogonal):
- Exit Line / Boundary errors (separate architectural issues)
🚀 Next Steps
Priority 1: Pattern 5+ Implementation
Target loops:
_trimloops (LoopBodyLocalchin break condition)_parse_object,_parse_array(method calls in loop body)
Estimated impact: 10-15 additional loops in JsonParser
Priority 2: .hako Rewrite Strategy
Simplification approach:
- Hoist
.length()calls to outer locals - Pre-compute
.substring()results outside loop - Simplify break conditions to use simple comparisons
Trade-off: Some loops may be easier to rewrite than to implement Pattern 5+
Priority 3: Coverage Metrics
Systematic observation needed:
# Run coverage analysis on JsonParser
./tools/analyze_joinir_coverage.sh tools/hako_shared/json_parser.hako
Expected categories:
- Pattern 1: Simple loops (no break/continue)
- Pattern 2: Loops with break (variable scope OK, method calls blocked)
- Pattern 3: Loops with if-else PHI
- Pattern 4: Loops with continue
- Unsupported: Pattern 5+ needed (method calls, LoopBodyLocal conditions)
✅ Conclusion
Bug Fix Status: ✅ Complete and Verified
Key Achievement: Function parameters correctly classified as OuterLocal
Verification Outcome: All tests demonstrate correct behavior:
- Function parameters: ✅ Correctly classified
- LoopBodyLocal: ✅ Correctly rejected
- Error messages: ✅ Accurate (method calls, not variable scope)
Overall Impact: Significant progress - variable scope classification is now correct. Remaining errors are legitimate feature gaps (Pattern 5+ needed), not misclassification bugs.
Build Status: ✅ cargo build --release successful (0 errors, 50 warnings)
📋 Verification Commands Used
# Build verification
cargo build --release
# Test 1: Function parameter loop
NYASH_JOINIR_DEBUG=1 NYASH_JOINIR_STRUCTURE_ONLY=1 \
./target/release/hakorune /tmp/test_jsonparser_simple.hako 2>&1 | \
grep -E "Phase 170-D|Error"
# Test 2: TrimTest (LoopBodyLocal)
NYASH_JOINIR_DEBUG=1 NYASH_JOINIR_STRUCTURE_ONLY=1 \
./target/release/hakorune local_tests/test_trim_main_pattern.hako 2>&1 | \
grep -E "Phase 170-D|Variable 'ch'"
# Test 3: JsonParser full
NYASH_JOINIR_STRUCTURE_ONLY=1 \
./target/release/hakorune tools/hako_shared/json_parser.hako 2>&1 | \
tail -40
End of Report