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.
This commit is contained in:
KtorZ 2024-08-04 10:33:58 +02:00
parent fbe2f82582
commit 2dca0c4185
No known key found for this signature in database
GPG Key ID: 33173CB6F77F4277
2 changed files with 21 additions and 17 deletions

View File

@ -69,16 +69,18 @@ impl<Info, Definitions> Module<Info, Definitions> {
} }
impl UntypedModule { impl UntypedModule {
pub fn dependencies(&self) -> Vec<(String, Span)> { pub fn dependencies(&self, env_modules: &[String]) -> Vec<String> {
self.definitions() self.definitions()
.flat_map(|def| { .flat_map(|def| {
if let Definition::Use(Use { if let Definition::Use(Use { module, .. }) = def {
location, module, .. let name = module.join("/");
}) = def if name == ENV_MODULE {
{ env_modules.to_vec()
Some((module.join("/"), *location))
} else { } else {
None vec![name]
}
} else {
Vec::new()
} }
}) })
.collect() .collect()

View File

@ -32,16 +32,9 @@ pub struct ParsedModule {
} }
impl ParsedModule { impl ParsedModule {
pub fn deps_for_graph(&self) -> (String, Vec<String>) { pub fn deps_for_graph(&self, env_modules: &[String]) -> (String, Vec<String>) {
let name = self.name.clone(); let name = self.name.clone();
let deps: Vec<_> = self.ast.dependencies(env_modules);
let deps: Vec<_> = self
.ast
.dependencies()
.into_iter()
.map(|(dep, _span)| dep)
.collect();
(name, deps) (name, deps)
} }
@ -124,10 +117,19 @@ impl ParsedModules {
} }
pub fn sequence(&self, our_modules: &BTreeSet<String>) -> Result<Vec<String>, Error> { pub fn sequence(&self, our_modules: &BTreeSet<String>) -> Result<Vec<String>, 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::<Vec<String>>();
let inputs = self let inputs = self
.0 .0
.values() .values()
.map(|m| m.deps_for_graph()) .map(|m| m.deps_for_graph(&env_modules))
.collect::<Vec<(String, Vec<String>)>>(); .collect::<Vec<(String, Vec<String>)>>();
let capacity = inputs.len(); let capacity = inputs.len();