From 2dca0c418565fd461482822671eec165718cd6dd Mon Sep 17 00:00:00 2001 From: KtorZ Date: Sun, 4 Aug 2024 10:33:58 +0200 Subject: [PATCH] Ensure env modules dependencies are properly handled. We figure out dependencies by looking at 'use' definition in parsed modules. However, in the case of environment modules, we must consider all of them when seeing "use env". Without that, the env modules are simply compiled in parallel and may not yet have been compiled when they are needed as actual dependencies. --- crates/aiken-lang/src/ast.rs | 16 +++++++++------- crates/aiken-project/src/module.rs | 22 ++++++++++++---------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/crates/aiken-lang/src/ast.rs b/crates/aiken-lang/src/ast.rs index dae941c2..f9966940 100644 --- a/crates/aiken-lang/src/ast.rs +++ b/crates/aiken-lang/src/ast.rs @@ -69,16 +69,18 @@ impl Module { } impl UntypedModule { - pub fn dependencies(&self) -> Vec<(String, Span)> { + pub fn dependencies(&self, env_modules: &[String]) -> Vec { self.definitions() .flat_map(|def| { - if let Definition::Use(Use { - location, module, .. - }) = def - { - Some((module.join("/"), *location)) + if let Definition::Use(Use { module, .. }) = def { + let name = module.join("/"); + if name == ENV_MODULE { + env_modules.to_vec() + } else { + vec![name] + } } else { - None + Vec::new() } }) .collect() diff --git a/crates/aiken-project/src/module.rs b/crates/aiken-project/src/module.rs index 804d5c6b..35ba60b6 100644 --- a/crates/aiken-project/src/module.rs +++ b/crates/aiken-project/src/module.rs @@ -32,16 +32,9 @@ pub struct ParsedModule { } impl ParsedModule { - pub fn deps_for_graph(&self) -> (String, Vec) { + pub fn deps_for_graph(&self, env_modules: &[String]) -> (String, Vec) { let name = self.name.clone(); - - let deps: Vec<_> = self - .ast - .dependencies() - .into_iter() - .map(|(dep, _span)| dep) - .collect(); - + let deps: Vec<_> = self.ast.dependencies(env_modules); (name, deps) } @@ -124,10 +117,19 @@ impl ParsedModules { } pub fn sequence(&self, our_modules: &BTreeSet) -> Result, Error> { + let env_modules = self + .0 + .values() + .filter_map(|m| match m.kind { + ModuleKind::Env => Some(m.name.clone()), + ModuleKind::Lib | ModuleKind::Validator => None, + }) + .collect::>(); + let inputs = self .0 .values() - .map(|m| m.deps_for_graph()) + .map(|m| m.deps_for_graph(&env_modules)) .collect::)>>(); let capacity = inputs.len();