diff --git a/src/host_providers/mir_builder.rs b/src/host_providers/mir_builder.rs index 9c19c11c..06825bb4 100644 --- a/src/host_providers/mir_builder.rs +++ b/src/host_providers/mir_builder.rs @@ -1,11 +1,17 @@ use crate::runner; use serde_json::Value as JsonValue; +use std::collections::HashMap; use std::fs; use std::io::Write; /// Convert Program(JSON v0) to MIR(JSON v0) and return it as a String. /// Fail-Fast: prints stable tags on stderr and returns Err with the same tag text. pub fn program_json_to_mir_json(program_json: &str) -> Result { + program_json_to_mir_json_with_imports(program_json, HashMap::new()) +} + +/// Convert Program(JSON v0) to MIR(JSON v0) with using imports support. +pub fn program_json_to_mir_json_with_imports(program_json: &str, imports: HashMap) -> Result { // Basic header check if !program_json.contains("\"version\"") || !program_json.contains("\"kind\"") { let tag = "[mirbuilder/input/invalid] missing version/kind keys"; @@ -13,8 +19,8 @@ pub fn program_json_to_mir_json(program_json: &str) -> Result { return Err(tag.into()); } - // Parse Program(JSON v0) into a MIR Module - let module = match runner::json_v0_bridge::parse_json_v0_to_module(program_json) { + // Parse Program(JSON v0) into a MIR Module with imports + let module = match runner::json_v0_bridge::parse_json_v0_to_module_with_imports(program_json, imports) { Ok(m) => m, Err(e) => { let tag = format!("[mirbuilder/parse/error] {}", e); diff --git a/src/runner/json_v0_bridge/lowering.rs b/src/runner/json_v0_bridge/lowering.rs index d4b9f1a3..7256ece6 100644 --- a/src/runner/json_v0_bridge/lowering.rs +++ b/src/runner/json_v0_bridge/lowering.rs @@ -98,10 +98,16 @@ pub(super) struct BridgeEnv { pub(super) allow_me_dummy: bool, pub(super) me_class: String, pub(super) try_result_mode: bool, + // Phase 21.8: using imports map (alias -> box_type) + pub(super) imports: HashMap, } impl BridgeEnv { pub(super) fn load() -> Self { + Self::with_imports(HashMap::new()) + } + + pub(super) fn with_imports(imports: HashMap) -> Self { let trm = crate::config::env::try_result_mode(); // フェーズM.2: no_phi変数削除 if crate::config::env::cli_verbose() { @@ -113,6 +119,7 @@ impl BridgeEnv { allow_me_dummy: std::env::var("NYASH_BRIDGE_ME_DUMMY").ok().as_deref() == Some("1"), me_class: std::env::var("NYASH_BRIDGE_ME_CLASS").unwrap_or_else(|_| "Main".to_string()), try_result_mode: trm, + imports, } } } @@ -250,11 +257,11 @@ pub(super) fn lower_stmt_list_with_vars( Ok(cur) } -pub(super) fn lower_program(prog: ProgramV0) -> Result { +pub(super) fn lower_program(prog: ProgramV0, imports: std::collections::HashMap) -> Result { if prog.body.is_empty() { return Err("empty body".into()); } - let env = BridgeEnv::load(); + let env = BridgeEnv::with_imports(imports); let mut module = MirModule::new("ny_json_v0".into()); let sig = FunctionSignature { name: "main".into(), diff --git a/src/runner/json_v0_bridge/lowering/expr.rs b/src/runner/json_v0_bridge/lowering/expr.rs index 7b0406b8..96db2ce3 100644 --- a/src/runner/json_v0_bridge/lowering/expr.rs +++ b/src/runner/json_v0_bridge/lowering/expr.rs @@ -51,6 +51,20 @@ impl<'a> VarScope for MapVars<'a> { if let Some(&vid) = self.vars.get(name) { return Ok(Some(vid)); } + // Phase 21.8: Check using-imported modules/boxes + if let Some(box_type) = env.imports.get(name) { + let dst = f.next_value_id(); + if let Some(bb) = f.get_block_mut(cur_bb) { + // Treat as static box reference - create a const string representing the box type + bb.add_instruction(MirInstruction::Const { + dst, + value: ConstValue::String(box_type.clone()), + }); + } + // Cache the resolution for subsequent uses + self.vars.insert(name.to_string(), dst); + return Ok(Some(dst)); + } if name == "me" { if env.allow_me_dummy { let dst = f.next_value_id(); diff --git a/src/runner/json_v0_bridge/mod.rs b/src/runner/json_v0_bridge/mod.rs index 3a52bf5f..26d13c42 100644 --- a/src/runner/json_v0_bridge/mod.rs +++ b/src/runner/json_v0_bridge/mod.rs @@ -4,8 +4,13 @@ mod lowering; use ast::{ProgramV0, StmtV0}; use lowering::lower_program; +use std::collections::HashMap; pub fn parse_json_v0_to_module(json: &str) -> Result { + parse_json_v0_to_module_with_imports(json, HashMap::new()) +} + +pub fn parse_json_v0_to_module_with_imports(json: &str, imports: HashMap) -> Result { let prog: ProgramV0 = serde_json::from_str(json).map_err(|e| format!("invalid JSON v0: {}", e))?; if crate::config::env::cli_verbose() { @@ -19,7 +24,7 @@ pub fn parse_json_v0_to_module(json: &str) -> Result Result {