6a05243f10
feat(joinir): Phase 65-2-B Box コンストラクタ型ヒント実装
...
Phase 65-2-B 完了:P3-B(Box コンストラクタ)型ヒント実装
## 実装内容
### 1. JoinInst::NewBox に type_hint 追加
- `src/mir/join_ir/mod.rs`: `type_hint: Option<MirType>` フィールド追加
- 段階的拡大のため Optional 設計(既存コード破壊なし)
### 2. expr.rs で型ヒント自動推論
- `infer_box_type()` 関数使用で Box 名から型を自動推論
- ArrayBox → Box("ArrayBox")
- StringBox → String
- MapBox → Box("MapBox")
- IntegerBox → Integer
- BoolBox → Bool
### 3. convert.rs/json.rs で型ヒント対応
- パターンマッチに type_hint 追加(Phase 65-3 で活用予定)
- JSON シリアライズ対応
## テスト結果
- ✅ type_inference モジュール: 8/8 PASS
- ✅ ビルド: 0 エラー
## 次のステップ
- Phase 65-3: lifecycle.rs で P3-A/P3-B 型ヒント統合
---
🌟 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-30 06:14:52 +09:00
b4b6a01b92
feat(joinir): Phase 65-2-A StringBox メソッド型ヒント実装
...
Phase 65-2-A 完了:P3-A(StringBox メソッド)型ヒント実装
## 実装内容
### 1. type_inference.rs 新規作成
- `infer_method_return_type()`: StringBox/ArrayBox/MapBox メソッド型推論
- `infer_box_type()`: Box コンストラクタ型推論(Phase 65-2-B 用)
- 8 テスト全て PASS
### 2. JoinInst::MethodCall に type_hint 追加
- `src/mir/join_ir/mod.rs`: `type_hint: Option<MirType>` フィールド追加
- 段階的拡大のため Optional 設計(既存コード破壊なし)
### 3. read_quoted.rs で型ヒント設定
- substring() → String(4箇所)
- length() → Integer(1箇所)
- read_quoted 系関数で完全な型ヒント供給
### 4. 汎用経路は None で後方互換性維持
- expr.rs: 汎用 MethodCall は `type_hint: None`
- convert.rs: 型ヒント追加(Phase 65-3 で活用予定)
- json.rs: JSON シリアライズ対応
## テスト結果
- ✅ type_inference モジュール: 8/8 PASS
- ✅ ビルド: 0 エラー
## 次のステップ
- Phase 65-2-B: Box コンストラクタ型ヒント実装
---
🌟 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-30 06:10:58 +09:00
e669f124d2
feat(joinir): Phase 64-1/2 P2型ヒント実装 & 削減条件準備
...
Phase 64-1: P2/P3 対象関数分類完了
- P2 対象リスト作成: read_quoted_from, IfMerge Simple/Multiple
- P3 将来拡張: MethodCall戻り値型, Box コンストラクタ
- 実装戦略確立: P2から1関数ずつ段階的拡大
Phase 64-2: P2 型ヒント供給実装完了
- read_quoted.rs: ループカウンタ i (Integer), 文字列 ch (String) 型確定
- if_merge.rs: infer_type_from_mir_pattern() 追加 (Const命令から型推論)
- A/B テスト追加: test_p2_if_merge_type_hint() で型ヒント伝播検証 ✅
技術的成果:
- JoinIR MergePair の type_hint 自動推論システム完成
- Phase 63 P1実装パターンを P2 に拡大適用
- 次ステップ: Phase 64-3 lifecycle.rs で P2 hint経路統合
修正ファイル:
- phase-63-joinir-type-info/README.md: Phase 64-1/2 セクション追加
- read_quoted.rs: MergePair 型ヒント追加 (Integer/String)
- if_merge.rs: infer_type_from_mir_pattern() + 型ヒント推論
- mir_joinir_if_select.rs: test_p2_if_merge_type_hint() 追加
🎯 削除条件 4/5 維持 (P1完了), Phase 64-3で P2拡大へ
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-30 05:12:59 +09:00
8f736358c4
feat(joinir): Phase 63-4 infer_type_from_phi degradation design
...
Phase 63-4: infer_type_from_phi を『JoinIR 型ヒント優先+従来ロジックフォールバック』に縮退する仕様を設計(実装は Phase 63-5+)
## Changes
### Documentation Updates
- **README.md**: Added complete Phase 63-4 design (63-4.1 through 63-4.5)
- 63-4.1: Current state analysis (definition location, callsites, role, JoinIR preparation)
- 63-4.2: Degradation spec (type_hint priority + fallback pattern)
- 63-4.3: Representative cases and A/B testing strategy (P1/P2/P3)
- 63-4.4: Deletion conditions (5 conditions, current: 2/5 = 40%)
- 63-4.5: Phase 63-5 handoff (infer_type_from_phi_with_hint() implementation tasks)
- **PHI_BOX_INVENTORY.md**: Updated if_phi.rs entry with Phase 63-4 deletion plan
- Added: "Phase 63-4完了: infer_type_from_phi の JoinIR type_hint 優先への縮退案を設計(実装は Phase 63-5+)"
- **CURRENT_TASK.md**: Added Phase 63-4 section with summary of design work
## Design Highlights
### Degradation Pattern
```rust
pub fn infer_type_from_phi_with_hint(
function: &MirFunction,
ret_val: ValueId,
types: &BTreeMap<ValueId, MirType>,
type_hint: Option<MirType>,
) -> Option<MirType> {
if let Some(hint) = type_hint {
return Some(hint); // Route B: JoinIR priority (SSOT)
}
infer_type_from_phi(function, ret_val, types) // Route A: Fallback
}
```
### Representative Cases
- **P1**: IfSelectTest.simple/local (Phase 63-5 target)
- **P2**: read_quoted_from (Phase 63-6+ target)
- **P3**: MethodCall/Box constructors (Phase 64+ expansion)
### Deletion Conditions (2/5 achieved)
1. ✅ JoinIR has type_hint field (Phase 63-3)
2. ✅ Type hints populated for representative cases (Phase 63-2)
3. ⏳ Degraded to type_hint priority (Phase 63-5)
4. ⏳ P1 cases determined by type_hint only (Phase 63-5)
5. ⏳ All functions use type hints (Phase 64+)
## Files Changed
- docs/private/roadmap2/phases/phase-63-joinir-type-info/README.md
- docs/private/roadmap2/phases/phase-30-final-joinir-world/PHI_BOX_INVENTORY.md
- CURRENT_TASK.md
## Next Steps
Phase 63-5: Implement degradation for P1 cases (IfSelectTest.simple/local)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 17:58:06 +09:00
7a1a4bd964
refactor(mir): loop_builder.rs モジュール化 - 6ファイルに分割
...
## リファクタリング内容
### ファイル構造変更
- `src/mir/loop_builder.rs` (1515行) 削除
- `src/mir/loop_builder/` ディレクトリ新設(6ファイル、1529行)
### 新規モジュール構成
1. **mod.rs** (6,293行 → 実際は約150行)
- モジュール定義とre-export
- LoopBuilder構造体定義
2. **loop_form.rs** (25,988行 → 実際は約650行)
- メインループlowering pipeline
- デバッグ/実験フラグ集約
3. **if_lowering.rs** (15,600行 → 実際は約390行)
- In-loop if lowering with JoinIR/PHI bridge
- **Phase 61-2コード完全保持**:
- JoinIR dry-run検証モード
- PhiSpec計算とA/B比較
4. **phi_ops.rs** (12,844行 → 実際は約320行)
- PHI emit helpers
- LoopFormOps/PhiBuilderOps impls
5. **control.rs** (4,261行 → 実際は約107行)
- break/continue capture
- predecessor bookkeeping
6. **statements.rs** (1,673行 → 実際は約42行)
- loop-body statement lowering entry point
7. **README.md** (752行 → 実際は約19行)
- モジュール責務とサブモジュール説明
### 設計原則
- **責務分離**: CFG構築/PHI生成/制御フロー/文処理を分離
- **Phase 61-2保持**: if_lowering.rsにJoinIR dry-run完全移行
- **phi_core委譲**: PHI構築ロジックは`phi_core`に委譲
## テスト結果
- Phase 61-2テスト: ✅ 2/2 PASS(dry-runフラグ、PhiSpec)
- loopformテスト: ✅ 14/14 PASS(退行なし)
- ビルド: ✅ 成功(エラー0件)
## 統計
- **純削減**: -1,521行(25ファイル変更)
- **loop_builder**: 1515行 → 1529行(+14行、6ファイル化)
- **可読性**: 巨大単一ファイル → 責務別モジュール
## ChatGPT設計・Claude確認
大規模リファクタリングをChatGPTが実施、Claudeが検証完了。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 12:44:40 +09:00
d6ce661923
docs(joinir): Phase P5 add responsibility docs to if patterns
...
Add responsibility documentation to if_return.rs, nested_if.rs,
and read_quoted.rs following the box-theory pattern.
Each module now has:
- One-line responsibility declaration
- Pattern example
- Generated JoinIR structure
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 09:04:28 +09:00
3af98964ed
feat(joinir): Phase P2-P4 Loop Pattern boxification
...
- P2: Create loop_patterns/ module structure
- common.rs: shared helpers (ParsedProgram, LoopContext, etc.)
- simple.rs: generic loop lowering
- filter.rs, print_tokens.rs: delegate to simple
- break_pattern.rs, continue_pattern.rs: new modules
- P3: Create LoopFrontendBinding layer
- Separate function name detection from pattern lowering
- detect_loop_pattern() for pattern classification
- P4: Break/Continue pattern migration
- Move Break/Continue handling from loop_patterns_old.rs
- Add LoopPattern::Break and LoopPattern::Continue variants
- Design: 3-layer architecture
- LoopFrontendBinding: function name → LoopPattern
- loop_patterns: LoopPattern → JoinIR
- Bridge/VM: Box semantics
All 56 JoinIR tests pass.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 09:04:18 +09:00
fd83903f87
feat(joinir): Phase P1 If Handler boxification - 40% code reduction
...
## Summary
Refactored loop-internal If statement handling into a boxified module
structure, achieving 154-line reduction (40%) from stmt_handlers.rs
with zero regression.
## Implementation
- Created if_in_loop/ module (9 files, ~480 lines)
- pattern.rs: IfInLoopPattern enum (5 variants)
- lowering/{empty,single_var_then,single_var_both,conditional_effect,unsupported}.rs
- Replaced lower_if_stmt_in_loop() (154 lines) with lower_if_stmt_in_loop_boxified()
- Made StatementEffect pub(crate) for module visibility
## Pattern Classification
1. Empty: condition-only check (no side effects)
2. SingleVarThen: if { x = a } → x = cond ? a : x
3. SingleVarBoth: if { x = a } else { x = b } → x = cond ? a : b
4. ConditionalEffect: if pred(v) { acc.push(v) } (filter pattern)
5. Unsupported: complex cases (Phase 54+)
## Test Results
✅ 56 JoinIR tests PASSED (0 failed, 0 regression)
✅ Build successful (1m 02s)
✅ Improved maintainability (easier to add new patterns)
## Files Changed
- src/mir/join_ir/frontend/ast_lowerer/
- if_in_loop/ (9 new files)
- mod.rs (+2 lines: module + pub use)
- stmt_handlers.rs (-154 lines: 40% reduction)
- CURRENT_TASK.md (+5 lines: Phase P1 記録)
- docs/development/refactoring/p1-if-handler-boxification-plan.md (new)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 07:20:56 +09:00
ad9daf37ac
feat(joinir): Phase 56 ArrayExtBox.filter JoinIR lowering完全実装
...
## Summary
ArrayExtBox.filter/2 の JoinIR Frontend lowering を完全実装し、
ConditionalMethodCall 命令を導入して filter パターンに対応。
56 JoinIR テスト全て PASS(退行なし)。
## Technical Changes
### 1. ConditionalMethodCall 命令追加
- **新規命令**: `if pred(v) { acc.push(v) }` パターン用
- **構造**: cond が true なら method 実行、false なら no-op
- **MIR 変換**: 4ブロック構造 (cond→then/else→merge)
### 2. AST JSON 拡張
- Break/Continue/FunctionCall に "type" フィールド追加
- ArrayLiteral/MapLiteral に "type" フィールド追加
- JoinIR Frontend 互換性向上
### 3. Expression Handler 拡張
- Unary 演算子(not, 負号)サポート
- Call(変数関数呼び出し)を MethodCall に変換
### 4. Loop Pattern Binding 修正
- `BoundExpr::Variable("n")` 問題修正
- `MethodCall { receiver: "arr", method: "size" }` に変更
- external_refs (arr, pred) を step 関数に伝播
### 5. If Statement Handler 拡張
- 条件付き側効果パターン(ケース4)追加
- MethodCall/Method 形式の statement を ConditionalMethodCall に変換
## Files Modified (10 files, +456/-45 lines)
- ast_json.rs: AST JSON "type" フィールド追加
- loop_frontend_binding.rs: n バインディング修正
- control_flow.rs: external_refs params 追加
- loop_patterns.rs: external_refs step 関数伝播
- expr.rs: Unary, Call handler 追加
- stmt_handlers.rs: ConditionalMethodCall パターン追加
- mod.rs: ConditionalMethodCall, UnaryOp 定義
- json.rs: ConditionalMethodCall, UnaryOp シリアライズ
- join_ir_runner.rs: ConditionalMethodCall, UnaryOp スタブ
- convert.rs: ConditionalMethodCall → MIR 変換
## Test Results
- 56 JoinIR tests: ✅ PASSED
- Regression: ❌ None
- ArrayExtBox.filter/2: ✅ JoinIR lowering 成功
## Milestone
JoinIR 2ループ完走達成:
- ✅ JsonTokenizer.print_tokens/0
- ✅ ArrayExtBox.filter/2 (NEW!)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 06:51:43 +09:00
e27934d91a
feat(joinir): Phase 52-53 LoopFrontendBinding JSON + Statement Handlers
...
Phase 52: LoopFrontendBinding JSON generation fixes
- Add receiver_to_json() for Field node structure (me.tokens)
- Add needs_me_receiver() for instance method detection
- Fix "condition" → "cond" key for JoinIR Frontend
- Add me parameter propagation in loop_patterns.rs
- Add JoinIR-compatible type fields in ast_json.rs
- Variable → "type": "Var"
- Literal → "type": "Int"/"Bool" (literal_to_joinir_json)
- BinaryOp → "type": "Binary"/"Compare" (is_compare_op)
- MethodCall → "type": "Method"
Phase 53: Statement Handler module for loop body
- NEW: stmt_handlers.rs with StatementEffect type
- Support: Local, Assignment, Print, Method, If statements
- If lowering: single variable update → Select instruction
- Remove hardcoded assert in loop_patterns.rs
- Replace with generic lower_statement() calls
Test results: 56 JoinIR tests PASS, 7 loop_frontend_binding tests PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 04:42:16 +09:00
6bb6f38a1c
feat(joinir): Phase 51 Field access / NewBox 式タイプ拡張
...
JoinIR Frontend の式タイプを拡張し、Field access と NewBox のパースと
MIR 変換をサポート。
## 新機能
### Field access (me.tokens 等)
- expr.rs に "Field" タイプハンドラ追加
- JoinInst::FieldAccess バリアント追加
- MIR 変換: FieldAccess → BoxCall (getter pattern)
### NewBox (new ArrayBox() 等)
- expr.rs に "NewBox" タイプハンドラ追加
- JoinInst::NewBox バリアント追加
- MIR 変換: NewBox → MirInstruction::NewBox
## 修正ファイル
- src/mir/join_ir/mod.rs: JoinInst 拡張
- src/mir/join_ir/frontend/ast_lowerer/expr.rs: パース対応
- src/mir/join_ir_vm_bridge/convert.rs: MIR 変換
- src/mir/join_ir_runner.rs: ハンドラ追加
- src/mir/join_ir/json.rs: JSON シリアライズ
## 注意
print_tokens/array_filter の JoinIR 完走には Phase 52 で
JSON 生成側 (LoopFrontendBinding) の修正が必要。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 21:10:30 +09:00
447bbec998
refactor(joinir): Split ast_lowerer and join_ir_vm_bridge into modules
...
ast_lowerer.rs → ast_lowerer/ (10 files):
- mod.rs: public surface + entry dispatch
- context.rs: ExtractCtx helpers
- expr.rs: expression-to-JoinIR extraction
- if_return.rs: simple if→Select lowering
- loop_patterns.rs: loop variants (simple/break/continue)
- read_quoted.rs: read_quoted_from lowering (Phase 45-46)
- nested_if.rs: NestedIfMerge lowering
- analysis.rs: loop if-var analysis + metadata helpers
- tests.rs: frontend lowering tests
- README.md: module documentation
join_ir_vm_bridge.rs → join_ir_vm_bridge/ (5 files):
- mod.rs: public surface + shared helpers
- convert.rs: JoinIR→MIR lowering
- runner.rs: VM execution entry (run_joinir_via_vm)
- meta.rs: experimental metadata-aware hooks
- tests.rs: bridge-specific unit tests
- README.md: module documentation
Benefits:
- Clear separation of concerns per pattern
- Easier navigation and maintenance
- Each file has single responsibility
- README documents module boundaries
Co-authored-by: ChatGPT <noreply@openai.com >
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 17:42:19 +09:00
d3eff1fceb
feat(joinir): Phase 45-46 read_quoted_from IfMerge implementation
...
Phase 45: read_quoted_from JoinIR Frontend/Bridge
- Implement lower_read_quoted_pattern() for Guard if + Loop with break + accumulator pattern
- Add T1-T4 Route B E2E tests (all PASS)
- Create phase45_read_quoted_fixture.hako for Route A testing
Phase 46: IfMerge extension for loop-internal if-body reassignment
- Add escape handling: if ch == "\\" { i = i+1; ch = s.substring(...) }
- Use IfMerge to merge i and ch after if-body (speculative execution)
- T5 PASS: "a\"b" → 'a"b' (escape handling works!)
Dev flags:
- HAKO_JOINIR_READ_QUOTED=1: Enable Phase 45 JoinIR route
- HAKO_JOINIR_READ_QUOTED_IFMERGE=1: Enable Phase 46 IfMerge escape handling
Test results (Route B):
- T1: "abc" → 'abc' ✅
- T2: "" → '' ✅
- T3: abc → '' ✅
- T4: xx"def" → 'def' ✅
- T5: "a\"b" → 'a"b' ✅
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 17:13:52 +09:00
66098fb9c8
feat(joinir): Phase 41-4 NestedIfMerge implementation
...
Phase 41-4.2: AST→JoinIR Frontend
- Add lower_nested_if_pattern() for parse_loop function
- Add try_match_nested_if_pattern() pattern detection (2-4 level nesting)
- Add collect_nested_if_structure() recursive helper
- Dev flag gating: HAKO_JOINIR_NESTED_IF=1 required
Phase 41-4.3: JoinIR→MIR Bridge
- Implement NestedIfMerge → multi-level Branch + Copy conversion
- Creates cascading condition checks with single else block
- Generates proper control flow: cond→level_n→then/else→merge
Phase 41-4.4: A/B Tests
- test_nested_if_pattern_detection_two_levels: 2-level detection
- test_nested_if_merge_lowering: Full lowering with dev flag
- test_nested_if_pattern_single_level_does_not_match: Negative case
All tests pass. Ready for parse_loop integration testing.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 12:45:19 +09:00
6fa2a95bdf
chore(joinir): Phase 40-4.1.1 dead code cleanup (16 lines)
...
- Remove use_joinir_for_array_filter() from env.rs (9 lines)
Route B is now default, env flag no longer needed
- Remove next_var_id() from ast_lowerer.rs (7 lines)
Duplicate of alloc_var() method
Cumulative deletion: 51 lines (35 + 16)
Tests: 5/5 Phase 40 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 11:31:18 +09:00
88358a4086
feat(joinir): Phase 40-1 JoinFuncMetaインフラ構築
...
Phase 40-1成果:
- JoinFuncMeta構造体 + JoinFuncMetaMap型(func_meta.rs)
- lower_loop_with_if_meta() 実験用API
- convert_join_module_to_mir_with_meta() MIRラッパ
- extract_if_in_loop_modified_vars() helper methods
- Integration tests 3/3 PASS
削減: 0行(レガシー経路が現役のため保留)
成果: JoinIR SSOTへの橋を架けた
新規ファイル:
- src/mir/join_ir/frontend/func_meta.rs (25行)
- src/tests/joinir_frontend_if_in_loop_test.rs (160行)
- src/tests/phase40_array_ext_filter_test.rs (135行)
変更ファイル:
- src/mir/join_ir/frontend/ast_lowerer.rs (+89行)
- src/mir/join_ir_vm_bridge.rs (+80行)
- src/tests/mod.rs (+2行)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 09:26:28 +09:00
a3f617874d
feat(joinir): Add Phase 40 implementation templates and integration points
...
Phase 35-39整理(C): JoinIR Frontend拡張雛形作成
- ast_lowerer.rs: extract_if_in_loop_modified_vars() template (~80 lines)
- ast_lowerer.rs: extract_assigned_vars_from_body() template (~80 lines)
- ast_lowerer.rs: lower_loop_case_a_simple() integration point marked
- join_ir_vm_bridge.rs: convert_join_function_to_mir() extension template (~100 lines)
Templates include:
- Detailed purpose and implementation plan
- Integration points in existing code
- Example usage (array_ext.filter)
- Links to Phase 39 design docs
- TODO(Phase 40-1/2/3/4) markers
Effect: Phase 40 implementation ready to start (追加箇所明確、実装漏れ防止)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 07:34:26 +09:00
853d80ba74
feat(joinir): Phase 34-7.5 helpers + Phase 34-8 Break/Continue implementation
...
Phase 34-7.5: Code organization improvements
- Added type conversion helpers (as_cont/as_func) in join_ir/mod.rs
- Enhanced docstrings for JoinCall/JoinJump with usage examples
- Improved error messages in join_ir_vm_bridge.rs
JoinIrFrontendTestRunner box implementation
- Created src/tests/helpers/joinir_frontend.rs (119 lines)
- Reduced test code by 83% (70 lines → 12 lines per test)
- 26% overall reduction in test file (284 → 209 lines)
Phase 34-8: Break/Continue pattern implementation
- Extended ast_lowerer.rs (+630 lines)
- lower_loop_break_pattern(): Break as Jump (early return)
- lower_loop_continue_pattern(): Continue as Select + Call
- Added Bool literal support in extract_value()
- Created 2 fixtures: loop_frontend_{break,continue}.program.json
- Added 2 A/B tests (all 6 Phase 34 tests PASS)
Technical achievements:
- Break = Jump (early return pattern)
- Continue = Select + Call (NOT Jump) - critical discovery
- 3-function structure sufficient (no k_continue needed)
- SSA-style re-assignment with natural var_map updates
Test results:
✅ joinir_frontend_if_select_simple_ab_test
✅ joinir_frontend_if_select_local_ab_test
✅ joinir_frontend_json_shape_read_value_ab_test
✅ joinir_frontend_loop_simple_ab_test
✅ joinir_frontend_loop_break_ab_test
✅ joinir_frontend_loop_continue_ab_test
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 01:02:49 +09:00
588129db65
feat(joinir): Phase 34-6 MethodCall 構造と本物の substring 意味論
...
**Phase 34-6 実装完了**: MethodCall 構造を JoinIR に追加し、本物の substring
呼び出しを通すことに成功。
## 主要変更
### 1. MethodCall 構造追加 (34-6.1)
- `src/mir/join_ir/mod.rs`: JoinInst::MethodCall バリアント (+8 lines)
- 構造: `{ dst, receiver, method, args }`
- 設計原則: JoinIR は構造のみ、意味論は MIR レベル
### 2. extract_value 更新 (34-6.2)
- `src/mir/join_ir/frontend/ast_lowerer.rs`: Method 処理本物化 (+37 lines)
- receiver/args を extract_value で再帰処理
- ダミー Const(0) 削除 → 本物の MethodCall 生成
- cond 処理修正: ValueId(0) ハードコード → extract_value で取得
### 3. JoinIR→MIR 変換実装 (34-6.3)
- `src/mir/join_ir_vm_bridge.rs`: MethodCall → BoxCall 変換 (+12 lines)
- `src/mir/join_ir/json.rs`: MethodCall JSON シリアライゼーション (+16 lines)
- `src/mir/join_ir_runner.rs`: MethodCall 未対応エラー (+7 lines)
### 4. テスト更新 (34-6.4)
- `docs/.../fixtures/json_shape_read_value.program.json`: 本物の substring 構造
- `src/tests/joinir_frontend_if_select.rs`: run_joinir_via_vm 使用
- テスト成功: v="hello", at=3 → "hel" ✅
## 成果
- ✅ テスト全通過(1 passed; 0 failed)
- ✅ 設計原則確立: JoinIR = 構造 SSOT、意味論 = MIR レベル
- ✅ Phase 33-10 原則との整合性: Method でも同じ原則適用
**ドキュメント更新**: CURRENT_TASK.md + TASKS.md(Phase 34-6 完了記録)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 17:05:46 +09:00
6a5701ead9
feat(joinir): Phase 34-4 & 34-5 — JoinIR Frontend Stage-1/meta 対応 & extract_value 汎用化
...
Phase 34-4: Stage-1/meta 実用関数対応
- 対象関数: JsonShapeToMap._read_value_from_pair/1
- フィクスチャ簡略化(Int 10/20 ダミー値)
- match 分岐に "_read_value_from_pair" 追加(1行変更)
- テスト追加: joinir_frontend_json_shape_read_value_ab_test
- DRY 原則維持(Phase 34-3 refactoring の完全勝利)
Phase 34-5: extract_value 汎用化 & 実用 if の意味論対応
- ExtractCtx 構造体追加(ValueId カウンタ + 変数名マップ)
- extract_value 実装(Int/Var/Method 対応)
- lower_if_return_pattern を extract_value ベースに統一
- extract_int_value 削除(重複コード削減)
- コメント更新(Phase 34-5 反映)
変更ファイル:
- src/mir/join_ir/frontend/ast_lowerer.rs: +248 -62 lines (ExtractCtx + extract_value)
- src/tests/joinir_frontend_if_select.rs: +66 lines (json_shape テスト)
- CURRENT_TASK.md: Phase 34-4 & 34-5 記録追加
- docs/private: Phase 34 ドキュメント追加(README/TASKS/fixtures)
テスト結果: 3 passed; 0 failed
- joinir_frontend_if_select_simple_ab_test (Phase 34-2)
- joinir_frontend_if_select_local_ab_test (Phase 34-3)
- joinir_frontend_json_shape_read_value_ab_test (Phase 34-4)
技術的成果:
- Int ダミー値 → 本物の式(Var)への段階的移行成功
- extract_value 統一により、今後の expr 拡張が容易に
- Method 呼び出し pattern match 実装(Phase 34-6 への準備完了)
- DRY 原則遵守(extract_int_value 削除、重複コード削減)
ガードレール完全遵守:
- Phase 34 frontend テスト専用(既定経路不変)
- JoinIR = PHI 生成器の原則維持
- 未対応パターンは panic(tiny テスト専用で合理的)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 16:31:06 +09:00
bb170a171e
refactor(joinir): DRY principle - unify simple/local lowering
...
lower_simple_if と lower_local_if の重複コード(132行×2)を統合。
**変更内容**
- lower_simple_if → lower_if_return_pattern にリネーム
- lower_local_if を削除(完全に同じロジックのため)
- 関数名分岐を "test" | "local" に統合
- Phase 34-2/34-3 のコメント統一
**効果**
- コード削減: 340行 → 236行(31%削減)
- 保守性向上: 修正1箇所で済む
- 意図明確化: simple/local が同じパターンであることを型で表現
**技術的意義**
- DRY原則遵守: 重複コード完全排除
- 「値としての if」の統一: Select への正規化が1関数に集約
- Phase 34-4 への準備: パターン追加が容易な構造
テスト: 2 passed (simple + local) ✅
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 15:34:30 +09:00
66fecd3d14
feat(joinir): Phase 34-2/34-3 JoinIR Frontend implementation
...
AST→JoinIR フロントエンド経路の基盤完成。simple/local pattern で
「値としての if」が同じ JoinIR Select に正規化されることを実証。
**Phase 34-2: Simple pattern 実装**
- AstToJoinIrLowerer::lower_program_json() 実装
- Program(JSON v0) → JoinModule 変換パイプライン確立
- IfSelectTest.test: if cond { return 10 } else { return 20 }
- 変数ID衝突バグ修正(params分スキップ)
**Phase 34-3: Local pattern 対応**
- lower_simple_if/lower_local_if 関数分岐実装
- IfSelectTest.local: 意味論的 local pattern 対応
- simple と local で JoinIR 出力が同じことを実証
**技術的成果**
- JoinIR = 意味論の SSOT: 構文の違いを Select に統一
- PHI 不要の証明: 値としての if は Select のみで表現可能
- テスト: 2 passed (simple + local)
**実装ファイル**
- src/mir/join_ir/frontend/ast_lowerer.rs (340 lines)
- src/mir/join_ir/frontend/mod.rs (46 lines)
- src/tests/joinir_frontend_if_select.rs (140 lines)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 15:31:12 +09:00