feat(joinir): Phase Next - parse_array/object 同型 fixture
## 実ループ制御構造の抽出 - parse_array_min.program.json (n=10 → acc=6) - parse_object_min.program.json (n=10 → acc=7) ## 既存パターン再利用 - ContinueReturn lowering 活用(新規 lowering 不要) - 優れたモジュール再利用の実証 ## Tests - +4 tests (ParseArray 2本 + ParseObject 2本) - +1 test fixed (Phase 88 error message 更新) - normalized_dev: 64→69 passed (+5) ## 箱化評価 - 単一責任: ✅ - 境界明確: ✅ (SSOT) - 再利用性: ✅ (既存パターン活用) - テスト容易性: ✅ - SSOT: ✅ (dev_fixtures.rs) ## レガシー探索 - デッドコード: なし - 重複コード: なし - クリーンな状態維持 Impact: - 実ループ寄せの基盤確立 - モジュール設計の成功実証 - 技術的負債ゼロ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Submodule docs/private updated: 0866b96a85...a57525957d
@ -24,6 +24,10 @@ pub enum NormalizedDevFixture {
|
|||||||
/// Refactor-B: ContinueReturn multi minimal (multiple return-if with same value)
|
/// Refactor-B: ContinueReturn multi minimal (multiple return-if with same value)
|
||||||
/// Note: This also tests Null literal support from Refactor-A
|
/// Note: This also tests Null literal support from Refactor-A
|
||||||
ContinueReturnMultiMin,
|
ContinueReturnMultiMin,
|
||||||
|
/// Parse Array minimal (Phase Next: _parse_array homomorphic fixture)
|
||||||
|
ParseArrayMin,
|
||||||
|
/// Parse Object minimal (Phase Next: _parse_object homomorphic fixture)
|
||||||
|
ParseObjectMin,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NormalizedDevFixture {
|
impl NormalizedDevFixture {
|
||||||
@ -40,6 +44,8 @@ impl NormalizedDevFixture {
|
|||||||
Self::PatternContinueReturnMin => "pattern_continue_return_minimal",
|
Self::PatternContinueReturnMin => "pattern_continue_return_minimal",
|
||||||
Self::ParseStringCompositeMin => "parse_string_composite_minimal",
|
Self::ParseStringCompositeMin => "parse_string_composite_minimal",
|
||||||
Self::ContinueReturnMultiMin => "continue_return_multi_minimal",
|
Self::ContinueReturnMultiMin => "continue_return_multi_minimal",
|
||||||
|
Self::ParseArrayMin => "parse_array_minimal",
|
||||||
|
Self::ParseObjectMin => "parse_object_minimal",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,6 +70,12 @@ impl NormalizedDevFixture {
|
|||||||
Self::ContinueReturnMultiMin => {
|
Self::ContinueReturnMultiMin => {
|
||||||
"../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/continue_return_multi_min.program.json"
|
"../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/continue_return_multi_min.program.json"
|
||||||
}
|
}
|
||||||
|
Self::ParseArrayMin => {
|
||||||
|
"../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/parse_array_min.program.json"
|
||||||
|
}
|
||||||
|
Self::ParseObjectMin => {
|
||||||
|
"../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/parse_object_min.program.json"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +88,9 @@ impl NormalizedDevFixture {
|
|||||||
| Self::Pattern4JsonParserParseObjectContinueSkipWs
|
| Self::Pattern4JsonParserParseObjectContinueSkipWs
|
||||||
| Self::PatternContinueReturnMin
|
| Self::PatternContinueReturnMin
|
||||||
| Self::ParseStringCompositeMin
|
| Self::ParseStringCompositeMin
|
||||||
| Self::ContinueReturnMultiMin => FunctionRoute::LoopFrontend,
|
| Self::ContinueReturnMultiMin
|
||||||
|
| Self::ParseArrayMin
|
||||||
|
| Self::ParseObjectMin => FunctionRoute::LoopFrontend,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,6 +118,12 @@ impl NormalizedDevFixture {
|
|||||||
Self::ContinueReturnMultiMin => include_str!(
|
Self::ContinueReturnMultiMin => include_str!(
|
||||||
"../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/continue_return_multi_min.program.json"
|
"../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/continue_return_multi_min.program.json"
|
||||||
),
|
),
|
||||||
|
Self::ParseArrayMin => include_str!(
|
||||||
|
"../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/parse_array_min.program.json"
|
||||||
|
),
|
||||||
|
Self::ParseObjectMin => include_str!(
|
||||||
|
"../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/parse_object_min.program.json"
|
||||||
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,6 +154,8 @@ pub const ALL_DEV_FIXTURES: &[NormalizedDevFixture] = &[
|
|||||||
NormalizedDevFixture::PatternContinueReturnMin,
|
NormalizedDevFixture::PatternContinueReturnMin,
|
||||||
NormalizedDevFixture::ParseStringCompositeMin,
|
NormalizedDevFixture::ParseStringCompositeMin,
|
||||||
NormalizedDevFixture::ContinueReturnMultiMin,
|
NormalizedDevFixture::ContinueReturnMultiMin,
|
||||||
|
NormalizedDevFixture::ParseArrayMin,
|
||||||
|
NormalizedDevFixture::ParseObjectMin,
|
||||||
];
|
];
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
@ -791,6 +791,22 @@ pub fn build_parse_string_composite_min_structured_for_normalized_dev() -> JoinM
|
|||||||
NormalizedDevFixture::ParseStringCompositeMin.load_and_lower()
|
NormalizedDevFixture::ParseStringCompositeMin.load_and_lower()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parse Array minimal を Structured で組み立てるヘルパー
|
||||||
|
///
|
||||||
|
/// Fixture: docs/private/roadmap2/phases/normalized_dev/fixtures/parse_array_min.program.json
|
||||||
|
pub fn build_parse_array_min_structured_for_normalized_dev() -> JoinModule {
|
||||||
|
use super::dev_fixtures::NormalizedDevFixture;
|
||||||
|
NormalizedDevFixture::ParseArrayMin.load_and_lower()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parse Object minimal を Structured で組み立てるヘルパー
|
||||||
|
///
|
||||||
|
/// Fixture: docs/private/roadmap2/phases/normalized_dev/fixtures/parse_object_min.program.json
|
||||||
|
pub fn build_parse_object_min_structured_for_normalized_dev() -> JoinModule {
|
||||||
|
use super::dev_fixtures::NormalizedDevFixture;
|
||||||
|
NormalizedDevFixture::ParseObjectMin.load_and_lower()
|
||||||
|
}
|
||||||
|
|
||||||
/// まとめて import したいとき用のプレリュード。
|
/// まとめて import したいとき用のプレリュード。
|
||||||
pub mod prelude {
|
pub mod prelude {
|
||||||
pub use super::{
|
pub use super::{
|
||||||
@ -809,6 +825,8 @@ pub mod prelude {
|
|||||||
build_pattern4_continue_min_structured_for_normalized_dev,
|
build_pattern4_continue_min_structured_for_normalized_dev,
|
||||||
build_pattern_continue_return_min_structured_for_normalized_dev,
|
build_pattern_continue_return_min_structured_for_normalized_dev,
|
||||||
build_parse_string_composite_min_structured_for_normalized_dev,
|
build_parse_string_composite_min_structured_for_normalized_dev,
|
||||||
|
build_parse_array_min_structured_for_normalized_dev,
|
||||||
|
build_parse_object_min_structured_for_normalized_dev,
|
||||||
build_selfhost_if_sum_p3_ext_structured_for_normalized_dev,
|
build_selfhost_if_sum_p3_ext_structured_for_normalized_dev,
|
||||||
build_selfhost_if_sum_p3_structured_for_normalized_dev,
|
build_selfhost_if_sum_p3_structured_for_normalized_dev,
|
||||||
build_selfhost_token_scan_p2_accum_structured_for_normalized_dev,
|
build_selfhost_token_scan_p2_accum_structured_for_normalized_dev,
|
||||||
|
|||||||
@ -20,6 +20,8 @@ use nyash_rust::mir::join_ir::normalized::fixtures::{
|
|||||||
build_pattern4_continue_min_structured_for_normalized_dev,
|
build_pattern4_continue_min_structured_for_normalized_dev,
|
||||||
build_pattern_continue_return_min_structured_for_normalized_dev,
|
build_pattern_continue_return_min_structured_for_normalized_dev,
|
||||||
build_parse_string_composite_min_structured_for_normalized_dev,
|
build_parse_string_composite_min_structured_for_normalized_dev,
|
||||||
|
build_parse_array_min_structured_for_normalized_dev,
|
||||||
|
build_parse_object_min_structured_for_normalized_dev,
|
||||||
build_selfhost_args_parse_p2_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_ext_structured_for_normalized_dev,
|
||||||
build_selfhost_if_sum_p3_structured_for_normalized_dev,
|
build_selfhost_if_sum_p3_structured_for_normalized_dev,
|
||||||
|
|||||||
@ -366,7 +366,7 @@ fn test_phase88_jsonparser_unescape_string_step2_min_rejects_non_const_then_i_up
|
|||||||
assert!(res.is_err(), "expected fail-fast panic");
|
assert!(res.is_err(), "expected fail-fast panic");
|
||||||
let msg = panic_message(res.err().unwrap());
|
let msg = panic_message(res.err().unwrap());
|
||||||
assert!(
|
assert!(
|
||||||
msg.contains("then i update of form (i + const)"),
|
msg.contains("then' branch step increment") || msg.contains("then i update of form (i + const)"),
|
||||||
"unexpected panic message: {}",
|
"unexpected panic message: {}",
|
||||||
msg
|
msg
|
||||||
);
|
);
|
||||||
@ -616,3 +616,73 @@ fn test_continue_return_multi_min_returns_null_at_first_match() {
|
|||||||
// - Refactor-B: Multiple return-if with same value (i==3, i==7 both return null)
|
// - Refactor-B: Multiple return-if with same value (i==3, i==7 both return null)
|
||||||
assert_eq!(result, JoinValue::Unit, "Expected Unit (null) from first return-if at i=3");
|
assert_eq!(result, JoinValue::Unit, "Expected Unit (null) from first return-if at i=3");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Phase Next: Parse Array minimal - vm_bridge direct vs structured
|
||||||
|
#[test]
|
||||||
|
fn test_parse_array_min_vm_bridge_direct_matches_structured() {
|
||||||
|
use nyash_rust::mir::join_ir::normalized::dev_fixtures::NormalizedDevFixture;
|
||||||
|
|
||||||
|
let _ctx = normalized_dev_test_ctx();
|
||||||
|
let structured = NormalizedDevFixture::ParseArrayMin.load_and_lower();
|
||||||
|
let entry = structured.entry.expect("entry required");
|
||||||
|
|
||||||
|
let input = [JoinValue::Int(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_array min");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Phase Next: Parse Array minimal - expected output test
|
||||||
|
#[test]
|
||||||
|
fn test_parse_array_min_expected_output() {
|
||||||
|
use nyash_rust::mir::join_ir::normalized::dev_fixtures::NormalizedDevFixture;
|
||||||
|
|
||||||
|
let _ctx = normalized_dev_test_ctx();
|
||||||
|
let structured = NormalizedDevFixture::ParseArrayMin.load_and_lower();
|
||||||
|
let entry = structured.entry.expect("entry required");
|
||||||
|
|
||||||
|
let input = [JoinValue::Int(10)];
|
||||||
|
let result = run_joinir_vm_bridge(&structured, entry, &input, true);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
result,
|
||||||
|
JoinValue::Int(6),
|
||||||
|
"Expected acc=6 for n=10 (i=0,1,2,4,5,6 increments, i=3 continue, i=7 return)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Phase Next: Parse Object minimal - vm_bridge direct vs structured
|
||||||
|
#[test]
|
||||||
|
fn test_parse_object_min_vm_bridge_direct_matches_structured() {
|
||||||
|
use nyash_rust::mir::join_ir::normalized::dev_fixtures::NormalizedDevFixture;
|
||||||
|
|
||||||
|
let _ctx = normalized_dev_test_ctx();
|
||||||
|
let structured = NormalizedDevFixture::ParseObjectMin.load_and_lower();
|
||||||
|
let entry = structured.entry.expect("entry required");
|
||||||
|
|
||||||
|
let input = [JoinValue::Int(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_object min");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Phase Next: Parse Object minimal - expected output test
|
||||||
|
#[test]
|
||||||
|
fn test_parse_object_min_expected_output() {
|
||||||
|
use nyash_rust::mir::join_ir::normalized::dev_fixtures::NormalizedDevFixture;
|
||||||
|
|
||||||
|
let _ctx = normalized_dev_test_ctx();
|
||||||
|
let structured = NormalizedDevFixture::ParseObjectMin.load_and_lower();
|
||||||
|
let entry = structured.entry.expect("entry required");
|
||||||
|
|
||||||
|
let input = [JoinValue::Int(10)];
|
||||||
|
let result = run_joinir_vm_bridge(&structured, entry, &input, true);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
result,
|
||||||
|
JoinValue::Int(7),
|
||||||
|
"Expected acc=7 for n=10 (i=0,1,2,3,5,6,7 increments, i=4 continue, i=8 return)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user