Commit Graph

7 Commits

Author SHA1 Message Date
5e3dec99e3 feat(joinir): Phase 171-172 Issue 4 - LoopScopeShapeBuilder unified initialization
Eliminates 50-60 lines of duplicated LoopScopeShape initialization across all 4 patterns.

**Changes**:
- New: `loop_scope_shape_builder.rs` with factory methods
- `empty_body_locals()`: For Pattern 1, 3 (condition-only analysis)
- `with_body_locals()`: For Pattern 2, 4 (AST-based body variable extraction)
- Updated all 4 patterns to use unified builder
- Includes unit tests for both factory methods

**Impact**:
- Pattern 1: 11 lines → 6 lines (5-line reduction)
- Pattern 2: 18 lines → 8 lines (10-line reduction)
- Pattern 3: 11 lines → 6 lines (5-line reduction)
- Pattern 4: 18 lines → 8 lines (10-line reduction)
- Total: 58 lines → 28 lines (30-line reduction, ~52%)

**Test**:
- cargo build --release:  PASS
- cargo test --release:  720/800 PASS (same as before)
- Unit tests:  3/3 PASS

Phase 171-172 Stage 1: 25-30% deletion target (30 lines achieved)
2025-12-08 03:39:46 +09:00
4e32a803a7 feat(joinir): Phase 33-22 CommonPatternInitializer & JoinIRConversionPipeline integration
Unifies initialization and conversion logic across all 4 loop patterns,
eliminating code duplication and establishing single source of truth.

## Changes

### Infrastructure (New)
- CommonPatternInitializer (117 lines): Unified loop var extraction + CarrierInfo building
- JoinIRConversionPipeline (127 lines): Unified JoinIR→MIR→Merge flow

### Pattern Refactoring
- Pattern 1: Uses CommonPatternInitializer + JoinIRConversionPipeline (-25 lines)
- Pattern 2: Uses CommonPatternInitializer + JoinIRConversionPipeline (-25 lines)
- Pattern 3: Uses CommonPatternInitializer + JoinIRConversionPipeline (-25 lines)
- Pattern 4: Uses CommonPatternInitializer + JoinIRConversionPipeline (-40 lines)

### Code Reduction
- Total reduction: ~115 lines across all patterns
- Zero code duplication in initialization/conversion
- Pattern files: 806 lines total (down from ~920)

### Quality Improvements
- Single source of truth for initialization
- Consistent conversion flow across all patterns
- Guaranteed boundary.loop_var_name setting (prevents SSA-undef bugs)
- Improved maintainability and testability

### Testing
- All 4 patterns tested and passing:
  - Pattern 1 (Simple While): 
  - Pattern 2 (With Break): 
  - Pattern 3 (If-Else PHI): 
  - Pattern 4 (With Continue): 

### Documentation
- Phase 33-22 inventory and results document
- Updated joinir-architecture-overview.md with new infrastructure

## Breaking Changes
None - pure refactoring with no API changes

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-07 21:02:20 +09:00
350dba92b4 feat(joinir): Phase 193-4 - Exit Binding Builder implementation
Implemented fully boxified exit binding generation for Pattern 3 & 4.
Eliminates hardcoded variable names and ValueId assumptions.

**New files**:
- docs/development/current/main/phase193_exit_binding_builder.md: Design document
- src/mir/builder/control_flow/joinir/patterns/exit_binding.rs: ExitBindingBuilder implementation (400+ lines)

**Key components**:
- LoopExitBinding: Maps JoinIR exit values to host function variables
- ExitBindingBuilder: Generates bindings from CarrierInfo + ExitMeta
- Comprehensive validation:
  - Carrier name mismatch detection
  - Missing carrier detection
  - Loop variable incorrectly in exit_values
- Builder methods:
  - new(): Create builder with metadata validation
  - build_loop_exit_bindings(): Generate bindings, update variable_map
  - apply_to_boundary(): Set JoinInlineBoundary host/join_outputs
  - loop_var_exit_binding(): Get loop variable exit binding
- Unit tests: 6 test cases covering single/multi-carrier and error scenarios

**Features**:
- Supports both single and multi-carrier loop patterns
- Automatic post-loop ValueId allocation for carriers
- Sorted carrier processing for determinism
- Full integration with CarrierInfo and ExitMeta from Phase 193-2

**Status**: Phase 193-4 implementation complete. Ready for Phase 193-5 integration.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-06 11:09:03 +09:00
d28ba4cd9d refactor(joinir): Phase 193-1 - AST Feature Extractor Box modularization
**Phase 193-1**: Create independent AST Feature Extractor Box module

## Summary
Extracted feature detection logic from router.rs into a new, reusable
ast_feature_extractor.rs module. This improves:
- **Modularity**: Feature extraction is now a pure, side-effect-free module
- **Reusability**: Can be used for Pattern 5-6 detection and analysis tools
- **Testability**: Pure functions can be unit tested independently
- **Maintainability**: Clear separation of concerns (router does dispatch, extractor does analysis)

## Changes

### New Files
- **src/mir/builder/control_flow/joinir/patterns/ast_feature_extractor.rs** (+180 lines)
  - `detect_continue_in_body()`: Detect continue statements
  - `detect_break_in_body()`: Detect break statements
  - `extract_features()`: Full feature extraction pipeline
  - `detect_if_else_phi_in_body()`: Pattern detection for if-else PHI
  - `count_carriers_in_body()`: Heuristic carrier counting
  - Unit tests for basic functionality

### Modified Files
- **src/mir/builder/control_flow/joinir/patterns/router.rs**
  - Removed 75 lines of feature detection code
  - Now delegates to `ast_features::` module
  - Phase 193 documentation in comments
  - Cleaner separation of concerns

- **src/mir/builder/control_flow/joinir/patterns/mod.rs**
  - Added module declaration for ast_feature_extractor
  - Updated documentation with Phase 193 info

## Architecture
```
router.rs (10 lines)
  └─→ ast_feature_extractor.rs (180 lines)
      - Pure functions for AST analysis
      - No side effects
      - High reusability
      - Testable in isolation
```

## Testing
 Build succeeds: `cargo build --release` compiles cleanly
 Binary compatibility: Existing .hako files execute correctly
 No logic changes: Feature detection identical to previous implementation

## Metrics
- Lines moved from router to new module: 75
- New module total: 180 lines (including tests and documentation)
- Router.rs reduced by ~40% in feature detection code
- New module rated  for reusability and independence

## Next Steps
- Phase 193-2: CarrierInfo Builder Enhancement
- Phase 193-3: Pattern Classification Improvement
- Phase 194: Further pattern detection optimizations

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-06 03:30:03 +09:00
a21501286e feat(joinir): Structural pattern detection + Pattern 4 scaffold
- Add LoopFeatures struct for structure-based detection (no name deps)
- Add LoopPatternKind enum and classify() function
- Pattern 3: has_if_else_phi && !has_break && !has_continue
- Pattern 4: has_continue == true (detection only, lowering TODO)
- Unify router to use extract_features()/classify() instead of legacy
- Remove AST dependency, use LoopForm/LoopScope only
- Add Pattern 4 test file (loop_continue_pattern4.hako)
- Pattern 3 test passes (sum=9)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-06 00:10:27 +09:00
67e2bfada4 feat(joinir): Phase 194 - Table-driven loop pattern router
Replace if/else chain with table-driven pattern dispatch for easier
pattern addition and maintenance.

# Changes

## New Files
- router.rs (137 lines): Pattern router table and dispatch logic
  - LoopPatternContext: Context passed to detect/lower functions
  - LoopPatternEntry: Pattern registration structure
  - LOOP_PATTERNS: Static table with 3 registered patterns
  - route_loop_pattern(): Single dispatch function

## Modified Files
- patterns/mod.rs (+8 lines): Export router module
- pattern1_minimal.rs (+19 lines): Added can_lower() + lower() wrapper
- pattern2_with_break.rs (+17 lines): Added can_lower() + lower() wrapper
- pattern3_with_if_phi.rs (+22 lines): Added can_lower() + lower() wrapper
- routing.rs (-21 lines): Replaced if/else chain with router call

# Architecture Improvement

## Before (if/else chain)
```rust
if func_name == "main" && has_sum {
    return pattern3(...);
} else if func_name == "main" {
    return pattern1(...);
} else if func_name == "JoinIrMin.main/0" {
    return pattern2(...);
}
```

## After (table-driven)
```rust
let ctx = LoopPatternContext::new(...);
route_loop_pattern(self, &ctx)?
```

# Adding New Patterns (Now Trivial!)

1. Create pattern4_your_name.rs
2. Implement can_lower() + lower()
3. Add entry to LOOP_PATTERNS table

That's it! No routing logic changes needed.

# Testing

 Pattern 1 (loop_min_while.hako): PASSED
 Pattern 2 (joinir_min_loop.hako): PASSED
 Pattern 3 (loop_if_phi.hako): Routes correctly (VM error is pre-existing)

Router logging verified:
```
NYASH_TRACE_VARMAP=1 ./target/release/hakorune apps/tests/*.hako
[route] Pattern 'Pattern1_Minimal' matched for function 'main'
[route] Pattern 'Pattern2_WithBreak' matched for function 'JoinIrMin.main/0'
[route] Pattern 'Pattern3_WithIfPhi' matched for function 'main'
```

# Line Counts

- router.rs: 137 lines (new)
- Total pattern files: 491 lines (3 patterns)
- routing.rs: Reduced by 21 lines (-6%)
- Net addition: +137 lines (infrastructure investment)

# Documentation

See router.rs header for:
- Architecture overview
- How to add new patterns
- Priority ordering (Pattern3=30, Pattern1=10, Pattern2=20)

Phase 194 complete - pattern addition is now a trivial task!

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-05 22:11:39 +09:00
282d2ef450 refactor: Extract pattern lowerers from control_flow.rs (Phase 2)
- Created joinir/patterns/ subdirectory
- Extracted Pattern 1: pattern1_minimal.rs (Simple While)
- Extracted Pattern 2: pattern2_with_break.rs (Loop with Break)
- Extracted Pattern 3: pattern3_with_if_phi.rs (Loop with If-Else PHI)
- Created patterns/mod.rs dispatcher
- Removed ~410 lines from main control_flow.rs
- Zero breaking changes, all tests pass
2025-12-05 20:45:23 +09:00