This commit is contained in:
Paul Tagliamonte
2025-03-31 16:51:46 -04:00
parent 0aa2824c20
commit ea73eb011c
8 changed files with 72 additions and 16 deletions

20
rust/Cargo.lock generated
View File

@ -1907,6 +1907,7 @@ dependencies = [
"serde_json", "serde_json",
"sha2", "sha2",
"tabled", "tabled",
"tempdir",
"thiserror 2.0.12", "thiserror 2.0.12",
"tokio", "tokio",
"tokio-tungstenite", "tokio-tungstenite",
@ -3084,6 +3085,15 @@ version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "remove_dir_all"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.12.15" version = "0.12.15"
@ -3779,6 +3789,16 @@ version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
[[package]]
name = "tempdir"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
dependencies = [
"rand 0.4.6",
"remove_dir_all",
]
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.19.0" version = "3.19.0"

View File

@ -22,7 +22,6 @@ debug = 0
[profile.dev.package] [profile.dev.package]
insta = { opt-level = 3 } insta = { opt-level = 3 }
similar = { opt-level = 3 }
[profile.test] [profile.test]
debug = "line-tables-only" debug = "line-tables-only"

View File

@ -69,6 +69,7 @@ serde = { workspace = true }
serde_json = { workspace = true } serde_json = { workspace = true }
sha2 = "0.10.8" sha2 = "0.10.8"
tabled = { version = "0.18.0", optional = true } tabled = { version = "0.18.0", optional = true }
tempdir = "0.3.7"
thiserror = "2.0.0" thiserror = "2.0.0"
toml = "0.8.19" toml = "0.8.19"
ts-rs = { version = "10.1.0", features = [ ts-rs = { version = "10.1.0", features = [

View File

@ -2229,7 +2229,7 @@ mod test {
parsing::ast::types::{DefaultParamVal, Identifier, Parameter}, parsing::ast::types::{DefaultParamVal, Identifier, Parameter},
}; };
use std::sync::Arc; use std::sync::Arc;
use tokio::{sync::RwLock, task::JoinSet}; use tokio::{io::AsyncWriteExt, sync::RwLock, task::JoinSet};
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn test_assign_args_to_params() { async fn test_assign_args_to_params() {
@ -2446,32 +2446,59 @@ a = foo()
let mut universe = HashMap::<String, Node<Program>>::new(); let mut universe = HashMap::<String, Node<Program>>::new();
// program a.kcl // program a.kcl
let programa = r#" let programa_kcl = r#"
a = 1 export a = 1
"#; "#;
let programa = crate::parsing::parse_str(&programa, ModuleId::default()) let programa = crate::parsing::parse_str(&programa_kcl, ModuleId::default())
.parse_errs_as_err() .parse_errs_as_err()
.unwrap(); .unwrap();
universe.insert("a.kcl".to_owned(), programa); universe.insert("a.kcl".to_owned(), programa);
// program b.kcl // program b.kcl
let programb = r#" let programb_kcl = r#"
import 'a.kcl' as x import a from 'a.kcl'
export b = a + 1
"#; "#;
let programb = crate::parsing::parse_str(&programb, ModuleId::default()) let programb = crate::parsing::parse_str(&programb_kcl, ModuleId::default())
.parse_errs_as_err() .parse_errs_as_err()
.unwrap(); .unwrap();
universe.insert("b.kcl".to_owned(), programb); universe.insert("b.kcl".to_owned(), programb);
// program c.kcl // program c.kcl
let programc = r#" let programc_kcl = r#"
import 'a.kcl' import a from 'a.kcl'
export c = a + 2
"#; "#;
let programc = crate::parsing::parse_str(&programc, ModuleId::default()) let programc = crate::parsing::parse_str(&programc_kcl, ModuleId::default())
.parse_errs_as_err() .parse_errs_as_err()
.unwrap(); .unwrap();
universe.insert("c.kcl".to_owned(), programc); universe.insert("c.kcl".to_owned(), programc);
let tmpdir = tempdir::TempDir::new("zma_kcl_load_all_modules").unwrap();
tokio::fs::File::create(tmpdir.path().join("a.kcl"))
.await
.unwrap()
.write_all(programa_kcl.as_bytes())
.await
.unwrap();
tokio::fs::File::create(tmpdir.path().join("b.kcl"))
.await
.unwrap()
.write_all(programb_kcl.as_bytes())
.await
.unwrap();
tokio::fs::File::create(tmpdir.path().join("c.kcl"))
.await
.unwrap()
.write_all(programc_kcl.as_bytes())
.await
.unwrap();
// ok we have all the "files" loaded, let's do a sort and concurrent // ok we have all the "files" loaded, let's do a sort and concurrent
// run here. // run here.
@ -2490,7 +2517,7 @@ import 'a.kcl'
fs: Arc::new(crate::fs::FileManager::new()), fs: Arc::new(crate::fs::FileManager::new()),
stdlib: Arc::new(RwLock::new(crate::std::StdLib::new())), stdlib: Arc::new(RwLock::new(crate::std::StdLib::new())),
settings: ExecutorSettings { settings: ExecutorSettings {
project_directory: Some("src/execution/_test/load_all_modules".parse().unwrap()), project_directory: Some(tmpdir.path().into()),
..Default::default() ..Default::default()
}, },
context_type: ContextType::Mock, context_type: ContextType::Mock,
@ -2500,23 +2527,24 @@ import 'a.kcl'
exec_ctxt.prepare_mem(&mut exec_state).await.unwrap(); exec_ctxt.prepare_mem(&mut exec_state).await.unwrap();
for modules in crate::walk::import_graph(&universe).unwrap().into_iter() { for modules in crate::walk::import_graph(&universe).unwrap().into_iter() {
eprintln!("Spawning {:?}", modules);
let mut set = JoinSet::new(); let mut set = JoinSet::new();
let (results_send, mut results_recv) = tokio::sync::mpsc::channel(1);
for module in modules { for module in modules {
let program = universe.get(&module).unwrap().clone(); let program = universe.get(&module).unwrap().clone();
let module = module.clone(); let module = module.clone();
let mut exec_state = exec_state.clone(); let mut exec_state = exec_state.clone();
let exec_ctxt = exec_ctxt.clone(); let exec_ctxt = exec_ctxt.clone();
let results_send = results_send.clone();
set.spawn(async move { set.spawn(async move {
let module = module; let module = module;
let mut exec_state = exec_state; let mut exec_state = exec_state;
let exec_ctxt = exec_ctxt; let exec_ctxt = exec_ctxt;
let program = program; let program = program;
let results_send = results_send;
// do we need to do anything with the result here? let result = exec_ctxt
let _ = exec_ctxt
.run( .run(
&crate::Program { &crate::Program {
ast: program.clone(), ast: program.clone(),
@ -2526,8 +2554,16 @@ import 'a.kcl'
) )
.await .await
.unwrap(); .unwrap();
results_send.send((module, result)).await.unwrap();
}); });
} }
drop(results_send);
while let Some((module_name, module_result)) = results_recv.recv().await {
eprintln!("Got result for {}", module_name);
eprintln!("{:?}", module_result);
}
set.join_all().await; set.join_all().await;
} }