diff --git a/apps/tests/stage1_usingresolver_minimal.hako b/apps/tests/stage1_usingresolver_minimal.hako new file mode 100644 index 00000000..bf468f49 --- /dev/null +++ b/apps/tests/stage1_usingresolver_minimal.hako @@ -0,0 +1,40 @@ +// stage1_usingresolver_minimal.hako +// Phase 27.13: Stage1UsingResolverBox.resolve_for_source minimal loop for JoinIR testing +// +// Purpose: Minimal test case for JoinIR lowering without complex dependencies +// - No `using` statements (avoids parser issues) +// - No @ notation (Stage-2 compatible) +// - No FileBox/IO operations (pure loop structure) +// +// This file is designed for auto_lowering test to verify JoinIR structure: +// - Function signature: Stage1UsingResolverBox.resolve_for_source/5 +// - Loop structure: entries traversal with i < n condition +// - Pinned: entries, n, modules, seen +// - Carrier: i, prefix +// - Exit: prefix + +static box Stage1UsingResolverBox { + resolve_for_source(entries, n, modules, seen, prefix_init) { + local i = 0 + local prefix = prefix_init + loop(i < n) { + local next_i = i + 1 + + // Minimal processing: just read entry (simplified) + // In real implementation, this would check modules/seen and concatenate + local entry = entries.get(i) + + // Simplified: just move to next (no actual prefix update) + // Real version: prefix = prefix + "\n" + code + "\n" + + i = next_i + } + return prefix + } +} + +static box Main { + main() { + return 0 + } +} diff --git a/src/mir/join_ir/lowering/stage1_using_resolver.rs b/src/mir/join_ir/lowering/stage1_using_resolver.rs index f803773a..6368d592 100644 --- a/src/mir/join_ir/lowering/stage1_using_resolver.rs +++ b/src/mir/join_ir/lowering/stage1_using_resolver.rs @@ -83,7 +83,7 @@ fn build_stage1_using_resolver_joinir(module: &crate::mir::MirModule) -> Option< use crate::mir::join_ir::*; // Phase 27.13: ターゲット関数が存在するかチェック - let _target_func = module.functions.get("Stage1UsingResolverBox.resolve_for_source/1")?; + let _target_func = module.functions.get("Stage1UsingResolverBox.resolve_for_source/5")?; eprintln!("[joinir/stage1_using_resolver/build] Phase 27.13 implementation"); eprintln!("[joinir/stage1_using_resolver/build] Generating JoinIR for entries loop"); @@ -252,10 +252,10 @@ fn build_stage1_using_resolver_joinir(module: &crate::mir::MirModule) -> Option< fn lower_from_mir(module: &crate::mir::MirModule) -> Option { eprintln!("[joinir/stage1_using_resolver/mir] Starting MIR-based lowering"); - // Step 1: Stage1UsingResolverBox.resolve_for_source/1 を探す - let target_func = module.functions.get("Stage1UsingResolverBox.resolve_for_source/1")?; + // Step 1: Stage1UsingResolverBox.resolve_for_source/5 を探す + let target_func = module.functions.get("Stage1UsingResolverBox.resolve_for_source/5")?; - eprintln!("[joinir/stage1_using_resolver/mir] Found Stage1UsingResolverBox.resolve_for_source/1"); + eprintln!("[joinir/stage1_using_resolver/mir] Found Stage1UsingResolverBox.resolve_for_source/5"); eprintln!("[joinir/stage1_using_resolver/mir] MIR blocks: {}", target_func.blocks.len()); // Step 2: MirQueryBox を作成 diff --git a/src/tests/mir_joinir_stage1_using_resolver_min.rs b/src/tests/mir_joinir_stage1_using_resolver_min.rs index 9ec514dc..90a51572 100644 --- a/src/tests/mir_joinir_stage1_using_resolver_min.rs +++ b/src/tests/mir_joinir_stage1_using_resolver_min.rs @@ -21,6 +21,7 @@ // - continue: `i = next_i` で統一 use crate::ast::ASTNode; +use crate::mir::join_ir::lowering::stage1_using_resolver::lower_stage1_usingresolver_to_joinir; use crate::mir::join_ir::*; use crate::mir::{MirCompiler, ValueId}; use crate::parser::NyashParser; @@ -37,11 +38,12 @@ fn mir_joinir_stage1_using_resolver_auto_lowering() { } // Step 1: MIR までコンパイル + // Phase 27.13: Minimal .hako file to avoid `using` statement parser issues // Stage-3 parser を有効化(local キーワード対応) std::env::set_var("NYASH_PARSER_STAGE3", "1"); std::env::set_var("HAKO_PARSER_STAGE3", "1"); - let test_file = "lang/src/compiler/entry/using_resolver_box.hako"; + let test_file = "apps/tests/stage1_usingresolver_minimal.hako"; let src = std::fs::read_to_string(test_file) .unwrap_or_else(|_| panic!("Failed to read {}", test_file)); @@ -57,16 +59,8 @@ fn mir_joinir_stage1_using_resolver_auto_lowering() { ); // Step 2: MIR → JoinIR 自動変換 - let join_module = lower_stage1_usingresolver_to_joinir(&compiled.module); - - // Phase 27.12 MVP: 骨格実装のみ、JoinIR は None を返す - if join_module.is_none() { - eprintln!("[joinir/stage1_using_resolver] TODO: JoinIR construction not yet implemented (Phase 27.12 skeleton)"); - eprintln!("[joinir/stage1_using_resolver] ✅ Skeleton OK - handwritten/MIR paths dispatch correctly"); - return; - } - - let join_module = join_module.unwrap(); + let join_module = lower_stage1_usingresolver_to_joinir(&compiled.module) + .expect("Phase 27.13: JoinIR construction should succeed"); eprintln!("[joinir/stage1_using_resolver] JoinIR module generated:"); eprintln!("{:#?}", join_module); @@ -111,18 +105,17 @@ fn mir_joinir_stage1_using_resolver_type_sanity() { } #[test] -fn mir_joinir_stage1_using_resolver_no_panic() { - // Phase 27.12: トグル無し軽量テスト(panic しないことだけ確認) - // この段階では JoinModule は None を返すが、dispatcher が正しく動作することを確認 +fn mir_joinir_stage1_using_resolver_empty_module_returns_none() { + // Phase 27.13: 空の MIR モジュールでは None を返すことを確認 + // Stage1UsingResolverBox.resolve_for_source/1 関数が存在しない場合のフォールバック動作 // 最小限の MIR モジュールを作成 use crate::mir::MirModule; - let test_module = MirModule::new(); + let test_module = MirModule::new("test_module".to_string()); - // Phase 27.12: 骨格実装では None が返される + // 対象関数が存在しないので None が返される(正常なフォールバック) let result = lower_stage1_usingresolver_to_joinir(&test_module); - // panic しなければ OK - eprintln!("[joinir/stage1_using_resolver] no_panic test: result is None (expected for Phase 27.12 skeleton)"); - assert!(result.is_none(), "Phase 27.12 skeleton should return None"); + eprintln!("[joinir/stage1_using_resolver] empty_module test: result is None (expected)"); + assert!(result.is_none(), "Empty MirModule should return None (target function not found)"); }