Commit Graph

15 Commits

Author SHA1 Message Date
233a49d902 feat(joinir): Phase 131-11 A-C - InfiniteEarlyExit パターン追加(検出部分)
## Step A: Feature Detection
- LoopPatternKind::InfiniteEarlyExit (Pattern 5) 追加
- LoopFeatures::is_infinite_loop フィールド追加
- detect_infinite_loop() で loop(true) 検出

## Step B: Classification Logic
- classify() を更新: Pattern 5 を Pattern 4 より優先
- Pattern 4 を狭化: has_continue && !has_break のみ
- 誤ルーティング完全除去

## Step C: Pattern Module
- pattern5_infinite_early_exit.rs 新規作成
- Fail-Fast 設計: 超狭い shape guard
- lowering はスケルトン(Phase 131-11-D で実装)

## 動作確認
- Pattern 5 正常検出 
- Shape guards 動作(1 break, 1 continue, 1 carrier)
- Pattern 4 誤ルーティング回避 

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 09:59:34 +09:00
af6f95cd4b Phase 33 NORM canon test: enforce normalized dev route for P1/P2/JP mini 2025-12-11 20:54:33 +09:00
d4597dacfa 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>
2025-12-11 13:13:08 +09:00
d7805e5974 feat(joinir): Phase 213-2 Step 2-2 & 2-3 Data structure extensions
Extended PatternPipelineContext and CarrierUpdateInfo for Pattern 3 AST-based generalization.

Changes:
1. PatternPipelineContext:
   - Added loop_condition: Option<ASTNode>
   - Added loop_body: Option<Vec<ASTNode>>
   - Added loop_update_summary: Option<LoopUpdateSummary>
   - Updated build_pattern_context() for Pattern 3

2. CarrierUpdateInfo:
   - Added then_expr: Option<ASTNode>
   - Added else_expr: Option<ASTNode>
   - Updated analyze_loop_updates() with None defaults

Status: Phase 213-2 Steps 2-2 & 2-3 complete
Next: Create Pattern3IfAnalyzer to extract if statement and populate update summary
2025-12-10 00:01:53 +09:00
94bf00faf9 refactor(joinir): Phase 183-3 Document LoopScopeShape construction paths
Clarifies that LoopScopeShape has two complementary construction paths
for different contexts (AST-based vs LoopForm-based).

## Analysis

After investigating, discovered these builders serve **different purposes**:

1. **AST-based** (`patterns/loop_scope_shape_builder.rs`):
   - Builds from AST during MIR generation
   - Extracts body_locals from ASTNode::Local declarations
   - Used in Pattern 1-4 lowerers

2. **LoopForm-based** (`loop_scope_shape/builder.rs`):
   - Builds from LoopForm during JoinIR lowering
   - Analyzes LoopFormIntake snapshots
   - Used in generic_case_a and pattern routing

These are NOT duplicates - they're complementary paths!

## Changes

1. **Cross-Reference Documentation**:
   - `patterns/loop_scope_shape_builder.rs`: Added Phase 183-3 section
   - `loop_scope_shape/builder.rs`: Added Phase 183-3 section
   - Both now reference each other for clarity

2. **LoopScopeShape Struct Documentation**:
   - Added "Phase 183-3: Construction Paths" section
   - Documents two construction paths and their contexts
   - Explains when to use each builder

3. **Clarified Responsibilities**:
   - AST-based: For MIR building phase
   - LoopForm-based: For JoinIR lowering phase
   - Both maintain consistent field initialization

## Benefits

- **Clear separation**: Documented different contexts for each builder
- **Maintainability**: Future developers understand which builder to use
- **No code changes**: Pure documentation improvement
- **Cross-references**: Easy navigation between related modules

## Testing

 All loop_scope_shape tests pass (24 tests)
 No behavioral changes
 Documentation-only refactoring

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-08 22:22:25 +09:00
149c343ace refactor: Quick Win cleanup - 102 lines deleted, zero regressions
Completed three high-efficiency refactoring tasks:

## Task 1: Pattern1Context deletion (40 lines)
- Removed deprecated Pattern1Context struct from simple_while_minimal.rs
- Removed context parameter from lowering pipeline
- Simplified API surface (one less unused type)
- Files: simple_while_minimal.rs, pattern1_minimal.rs, loop_to_join.rs

## Task 2: #[allow(dead_code)] cleanup (62 lines)
- Deleted new_with_outputs() from inline_boundary.rs (truly dead, deprecated)
- Deleted extract_type_hint() from generic_type_resolver.rs (future placeholder)
- Removed 3 incorrect annotations (code IS actually used)
- Added clear comments for future-work items

## Task 3: Test organization (0 lines, +26 doc lines)
- Added 4-section navigation to loop_scope_shape/tests.rs
- Improved test discoverability (17 tests → organized by module)
- Low-risk organization improvement
- Easy path for future per-module test file splitting

## Summary
- Total deletion: 102 net lines
- Files modified: 9
- Build status:  Clean (0 errors, 0 warnings)
- Test status:  21/21 PASS
- Regressions: 0

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-07 23:59:28 +09:00
4170500c51 feat(joinir): Phase 170-C-2b LoopUpdateSummary wiring into shape detection
Wire LoopUpdateSummary box into real code paths:

- Add `update_summary: Option<LoopUpdateSummary>` field to LoopFeatures
- Add `detect_with_updates()` method to CaseALoweringShape
  - Uses UpdateKind (CounterLike/AccumulationLike) for classification
  - Single CounterLike carrier → StringExamination
  - AccumulationLike present → ArrayAccumulation or IterationWithAccumulation
- Update loop_to_join.rs to use detect_with_updates()
- Update deprecated detect() to use detect_with_updates() internally
- Set update_summary: None in AST-based feature extraction

Carrier name heuristics now encapsulated in LoopUpdateSummary box.
No regression: 15/16 loop smoke tests pass (1 failure is pre-existing).

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-07 14:33:54 +09:00
367aa83240 feat(joinir): Phase 170-C-1 Carrier name heuristic for shape detection
Add detect_with_carrier_name() to improve CaseALoweringShape detection
accuracy by using carrier variable names as a heuristic.

Since LoopUpdateAnalyzer operates at AST level (not accessible from MIR),
use carrier naming conventions instead:

- Typical index names (i, e, idx, pos, start, end) → StringExamination
- Other names (result, items, defs) → ArrayAccumulation

This reduces Generic fallback cases for single-carrier loops.

Changes:
- case_a_lowering_shape.rs: Add detect_with_carrier_name(), is_typical_index_name()
- loop_to_join.rs: Extract progress_carrier name, call new detection function

Phase 170-C-2 can add MIR-based update pattern analysis for higher accuracy.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-07 14:07:43 +09:00
82857c515b refactor(joinir): Phase 170-A Step 1.5 - LoopFeatures-based detection API
Clarify design principle: CaseALoweringShape does NOT look at function names.
Input must be LoopFeatures/LoopPatternKind only (structure-based detection).

Changes:
- Add detect_from_features(LoopFeatures, carrier_count, has_progress_carrier)
- Deprecate detect(LoopScopeShape) with backward-compat wrapper
- Case-A now rejects loops with `has_continue` (only break is allowed)
- Document Phase 170-B future work (loop body AST analysis)

Design Principle:
> "CaseALoweringShape は 関数名を見ない。LoopFeatures/LoopPatternKind だけを入力にする"

This ensures generic routing works for ANY structurally matching loop.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-07 13:19:28 +09:00
4b30edd6f4 feat(joinir): Phase 170-A Step 1 - CaseALoweringShape enum and detection
Introduce structure-based Case-A loop routing to replace hardcoded
function name matching. Phase 170-A is about enabling generic routing
for ANY loop matching Case-A structural properties.

New Module: case_a_lowering_shape.rs
- CaseALoweringShape enum: StringExamination, ArrayAccumulation,
  IterationWithAccumulation, Generic, NotCaseA
- CaseALoweringShape::detect(scope) - heuristic-based shape detection
- Supports helper methods: is_recognized(), name()

Motivation:
- Current loop_to_join.rs:378-402 hardcodes 4 function names
- New functions with same structure can't be reused
- Structure-based approach enables generic lowering

Phase 170-A Roadmap:
- Step 1: CaseALoweringShape enum  (this commit)
- Step 2: loop_to_join.rs shape-based routing (next)
- Step 3: Deprecate is_case_a_minimal_target() (future)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-07 13:14:22 +09:00
8633224061 JoinIR/SSA/Stage-3: sync CURRENT_TASK and dev env 2025-12-01 11:10:46 +09:00
2ea0f2a202 Remove Trio boxes and tidy loop scope warnings 2025-11-30 11:46:14 +09:00
375bb66b41 feat(phi_core): Phase 69-4.2 Trio公開面削減方針明文化
## 変更内容

### src/mir/phi_core/mod.rs
- Trio Legacy Boxes (3箱) の削除方針をコメント追加
  - LoopVarClassBox (578行)
  - LoopExitLivenessBox (414行)
  - LocalScopeInspectorBox (361行)
- 外部依存2箇所を明記:
  1. loop_form_intake.rs (~30行)
  2. loop_snapshot_merge.rs (~60行)
- TODO(Phase 70) マーカー設置(削減見込み ~1,443行)

### docs/development/current/main/phase69-4-trio-deletion-plan.md
- Phase 69-4 全体計画文書作成
- Phase 69-4.1: Trio callsite 棚卸し結果記録 
- Phase 69-4.2: phi_core 公開面削減完了記録 
- Phase 69-4.3-5: 未実施タスク整理 

## Phase 69-4.2 達成内容

**達成**:
-  Trio 削除計画の明文化
-  外部依存箇所の記録
-  Phase 70 削除条件の TODO 化

**未達成(Phase 70 で実施)**:
-  pub 公開除去(外部依存残存のため継続)
-  phi_core 内部化(LoopScopeShape 移行後に実現)

## 次のステップ

Phase 69-4.3: json_v0_bridge の Trio 依存を LoopScopeShape に寄せる設計

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 10:01:49 +09:00
7de192aa6b feat(mir): Phase 69-3 Fix MIR non-determinism with BTreeSet
Replace HashSet with BTreeSet for CFG predecessors/successors:
- BasicBlock.predecessors: HashSet → BTreeSet
- BasicBlock.successors: HashSet → BTreeSet
- LoopFormOps.get_block_predecessors(): returns BTreeSet
- BasicBlock.dominates(): takes &[BTreeSet<BasicBlockId>]

This ensures deterministic PHI generation and test stability.

Test results:
- loop_with_continue_and_break tests: now deterministic (3/3 same output)
- loopform tests: 14/14 PASS (no regressions)
- merge_exit_with_classification tests: 3/3 PASS

Technical changes (6 files):
- basic_block.rs: BTreeSet types + new() initialization
- loopform_builder.rs: trait signature + 2 mock implementations
- phi_ops.rs: return type
- json_v0_bridge/loop_.rs: return type

Same pattern as Phase 25.1 (MirFunction.blocks HashMap → BTreeMap).

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 09:38:28 +09:00
aef9374b5a refactor(joinir): LoopScopeShape モジュール箱化
## 目的

loop_scope_shape.rs(1274行)を責務別に7ファイルに分割し、
箱理論に基づいた保守性の高い構造に再構成。

## 箱化構造

```
loop_scope_shape/
├── README.md        - 責務説明
├── mod.rs          - モジュール統合
├── shape.rs        - 変数分類のSSOT + 質問系API(Phase 48-4)
├── builder.rs      - LoopForm/Trio からの組み立て
├── case_a.rs       - Case-A minimal ターゲット判定
├── context.rs      - generic_case_a 共通コンテキスト
└── tests.rs        - 回帰テスト(13本)
```

## 責務分離

### shape.rs(核心)
- **SSOT**: 変数分類(pinned/carrier/body_local/exit_live)
- **Phase 48-4 API**:
  - `get_exit_live()`: LoopExitLivenessBox 代替
  - `is_available_in_all()`: LocalScopeInspectorBox 代替
  - `variable_definitions`: Phase 48-5+ で統合予定

### builder.rs(組み立て)
- `from_existing_boxes_legacy()`: Trio → LoopScopeShape
- `from_loop_form()`: Phase 48-2 で内部化(Trio 依存削減)
- Case-A ルーティング込み

### case_a.rs(判定)
- `is_case_a_minimal_target()`: Phase 30 F-3.1 ハードコード集合

### context.rs(共通化)
- `CaseAContext`: generic_case_a 共通ロジック

### tests.rs(検証)
- 13本のテスト(Phase 48-4 の2本含む)
- 回帰防止の完全カバレッジ

## Phase 48-4 テスト復活

リファクタリング時に削除された2本のテストを復活:
- `test_is_available_in_all_phase48_4`: 空の variable_definitions
- `test_is_available_in_all_phase48_5_future`: Phase 48-5+ シミュレート

## テスト結果

```
running 13 tests
test test_get_exit_live ... ok
test test_is_available_in_all_phase48_4 ... ok
test test_is_available_in_all_phase48_5_future ... ok
[... 10 other tests ...]
test result: ok. 13 passed; 0 failed
```

## 箱理論の実践

### 箱化の利点
-  単一責務: shape.rs が SSOT、builder.rs が組み立て
-  拡張容易: 新しい入力経路は builder.rs に箱追加
-  テスタビリティ: tests.rs で独立検証
-  API安定性: shape.rs の質問系 API が外部インターフェース

### Phase 48-5+ への橋渡し
- shape.rs に Phase 48-4 API が配置済み
- builder.rs で Trio 依存を段階削除可能
- variable_definitions 統合の準備完了

## 修正ファイル

- 削除: `src/mir/join_ir/lowering/loop_scope_shape.rs` (1274行)
- 新規: `src/mir/join_ir/lowering/loop_scope_shape/` (7ファイル)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 07:14:50 +09:00