Commit Graph

2 Commits

Author SHA1 Message Date
e8d93f107c feat(mir): Loop Canonicalizer Phase 2 - dev-only observation
## Summary
ループ入口で LoopSkeleton/RoutingDecision を観測できるようにした。
既定挙動は完全不変(dev-only の並行観測のみ)。

## Changes
- src/mir/loop_canonicalizer/mod.rs: canonicalize_loop_expr() 追加
  - Phase 2 最小実装: loop 構造検証のみ
  - パターン検出は未実装(全て Fail-Fast)
  - LoopSkeleton の基本構造(HeaderCond step)を生成
  - 詳細な Fail-Fast 理由を返す
- src/mir/builder/control_flow/joinir/routing.rs: dev-only 観測ポイント
  - joinir_dev_enabled() ON 時のみ観測ログ出力
  - LoopSkeleton/RoutingDecision の内容を可視化
  - 既存の routing/lowering は完全無変更
- 最小実装: skip_whitespace 相当の構造検証のみ対応
- 追加テスト:
  - test_canonicalize_rejects_non_loop
  - test_canonicalize_minimal_loop_structure
  - test_canonicalize_rejects_multi_statement_loop
  - test_canonicalize_rejects_if_without_else

## Tests
- cargo test --release --lib: 1043 passed (退行なし)
- HAKO_JOINIR_DEBUG=1: 観測ログ出力確認
- デフォルト: 完全無変更(ログも挙動も)

## Acceptance Criteria
 joinir_dev_enabled() ON 時のみ観測ログが出る
 joinir_dev_enabled() OFF 時は完全に無変更(ログも挙動も)
 既存の smoke / cargo test --release --lib が退行しない
 最小パターン(if-else with break)で LoopSkeleton が生成できる
 未対応パターンは Fail-Fast で詳細理由を返す

Phase 137-2 complete
2025-12-16 05:17:56 +09:00
2bdf1abe78 feat(mir): Phase 1 - Loop Canonicalizer type definitions
Implements the foundation for loop canonicalization - a preprocessing
layer that decomposes AST loops into normalized skeleton representation
to prevent combinatorial explosion in pattern detection.

## Implementation (Phase 1)

Created `src/mir/loop_canonicalizer/mod.rs` with:

1. **Core Types**:
   - `LoopSkeleton`: Canonical loop representation
   - `SkeletonStep`: Step kinds (HeaderCond, BreakCheck, ContinueCheck, Update, Body)
   - `UpdateKind`: Carrier update classification (ConstStep, Conditional, Arbitrary)
   - `ExitContract`: Exit presence tracking (break/continue/return)
   - `CarrierSlot`: Loop variables with roles and update rules
   - `CarrierRole`: Semantic roles (Counter, Accumulator, ConditionVar, Derived)
   - `CapturedSlot`: Outer scope variable capture

2. **Capability Guard**:
   - `RoutingDecision`: Pattern selection with diagnostics
   - `capability_tags` module: Standardized Fail-Fast vocabulary
     (CAP_MISSING_CONST_STEP, CAP_MISSING_SINGLE_BREAK, etc.)

3. **Helper Methods**:
   - Skeleton counting (break_checks, continue_checks)
   - Carrier name extraction
   - Exit contract queries
   - Display implementations for debugging

4. **Unit Tests**: 6 tests covering all basic functionality

## Design Principles

- **Input**: AST only (no JoinIR dependencies)
- **Output**: LoopSkeleton only (no BlockId/ValueId)
- **Boundary**: Clear separation from lowering concerns
- **Fail-Fast**: Capability-based rejection with clear reasons

## Next Steps (Not in this commit)

- Phase 2: `LoopCanonicalizer::canonicalize(ast) -> Result<LoopSkeleton>`
- Phase 3: Test with skip_whitespace fixture
- Phase 4: Integration with existing JoinIR lowering

## Acceptance Criteria

 `cargo build --release` succeeds
 `cargo test --release --lib` passes (1039 tests)
 6 new unit tests for loop_canonicalizer pass
 No regressions in existing tests

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-16 04:59:26 +09:00