feat(joinir): Phase 90 P0 - ParseStringComposite pattern

## Composite Pattern
- Continue(escape i+=2) + EarlyReturn(close quote)
- parse_string_composite_pattern.rs (50行、continue_return 再利用)
- 89% コード削減(450行→50行)

## Shape Detection
- BinOp Add const 2 検出(escape 特徴)
- LoopStepInspector 活用(Phase 89 リファクタ成果)

## SSOT Integration
- dev_fixtures.rs に登録
- StepCalculator 再利用(Phase 89-2 成果)

## Tests
- +2 tests (vm_bridge + 期待値 n=10→acc=5)
- normalized_dev: 61→63 passed
- lib: 993 passed (回帰なし)

Impact:
- Reuse over Duplication 実践
- Phase 89 リファクタ成果の完全活用
- 箱化原則 5/5 遵守

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-14 03:36:45 +09:00
parent 70ceec1e3e
commit 45add0f5d3
12 changed files with 353 additions and 2 deletions

View File

@ -19,6 +19,7 @@ use nyash_rust::mir::join_ir::normalized::fixtures::{
build_pattern3_json_if_sum_min_structured_for_normalized_dev,
build_pattern4_continue_min_structured_for_normalized_dev,
build_pattern_continue_return_min_structured_for_normalized_dev,
build_parse_string_composite_min_structured_for_normalized_dev,
build_selfhost_args_parse_p2_structured_for_normalized_dev,
build_selfhost_if_sum_p3_ext_structured_for_normalized_dev,
build_selfhost_if_sum_p3_structured_for_normalized_dev,

View File

@ -568,3 +568,34 @@ fn test_normalized_pattern_continue_return_min_expected_output() {
"Expected acc=4 for n=10 (i=0,1,3,4 increments acc, i=2 skipped by continue, i=5 early return)"
);
}
/// Phase 90 P0: Parse String Composite minimal - vm_bridge direct vs structured
#[test]
fn test_parse_string_composite_min_vm_bridge_direct_matches_structured() {
let _ctx = normalized_dev_test_ctx();
let structured = build_parse_string_composite_min_structured_for_normalized_dev();
let entry = structured.entry.expect("structured entry required");
let input = [JoinValue::Int(10)]; // n = 10
let base = run_joinir_vm_bridge(&structured, entry, &input, false);
let dev = run_joinir_vm_bridge(&structured, entry, &input, true);
assert_eq!(base, dev, "vm bridge mismatch for parse_string composite min");
}
/// Phase 90 P0: Parse String Composite minimal - expected output test
#[test]
fn test_parse_string_composite_min_expected_output() {
let _ctx = normalized_dev_test_ctx();
let structured = build_parse_string_composite_min_structured_for_normalized_dev();
let entry = structured.entry.expect("structured entry required");
let input = [JoinValue::Int(10)]; // n = 10
let result = run_joinir_vm_bridge(&structured, entry, &input, true);
assert_eq!(
result,
JoinValue::Int(5),
"Expected acc=5 for n=10 (i=0,1,2,5,6 increments acc, i=3 escape continue, i=7 close quote return)"
);
}