wip
This commit is contained in:
@ -142,6 +142,48 @@ impl ExecutorContext {
|
|||||||
result.map(|result| (result, env_ref, local_state.module_exports))
|
result.map(|result| (result, env_ref, local_state.module_exports))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Execute an AST's program.
|
||||||
|
#[async_recursion]
|
||||||
|
pub(super) async fn load_all_modules<'a>(
|
||||||
|
&'a self,
|
||||||
|
modules: &mut HashMap<String, crate::parsing::ast::types::Program>,
|
||||||
|
program: NodeRef<'a, crate::parsing::ast::types::Program>,
|
||||||
|
exec_state: &mut ExecState,
|
||||||
|
) -> Result<(), KclError> {
|
||||||
|
for statement in &program.body {
|
||||||
|
match statement {
|
||||||
|
BodyItem::ImportStatement(import_stmt) => {
|
||||||
|
let source_range = SourceRange::from(import_stmt);
|
||||||
|
let attrs = &import_stmt.outer_attrs;
|
||||||
|
let module_id = self
|
||||||
|
.open_module(&import_stmt.path, attrs, exec_state, source_range)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let Some(module) = exec_state.get_module(module_id) else {
|
||||||
|
crate::log::log("we got back a module id that doesn't exist");
|
||||||
|
unreachable!();
|
||||||
|
};
|
||||||
|
|
||||||
|
let progn = {
|
||||||
|
// this dance is to avoid taking out a mut borrow
|
||||||
|
// below on exec_state after borrowing here. As a
|
||||||
|
// result, we need to clone (ugh) the program for
|
||||||
|
// now.
|
||||||
|
let ModuleRepr::Kcl(ref progn, _) = module.repr else {
|
||||||
|
// not a kcl file, we can skip this
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
progn.clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
self.load_all_modules(modules, &progn, exec_state).await?;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Execute an AST's program.
|
/// Execute an AST's program.
|
||||||
#[async_recursion]
|
#[async_recursion]
|
||||||
pub(super) async fn exec_block<'a>(
|
pub(super) async fn exec_block<'a>(
|
||||||
|
@ -212,6 +212,10 @@ impl ExecState {
|
|||||||
self.global.module_infos.insert(id, module_info);
|
self.global.module_infos.insert(id, module_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(super) fn get_module(&mut self, id: ModuleId) -> Option<&ModuleInfo> {
|
||||||
|
self.global.module_infos.get(&id)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn length_unit(&self) -> UnitLen {
|
pub fn length_unit(&self) -> UnitLen {
|
||||||
self.mod_local.settings.default_length_units
|
self.mod_local.settings.default_length_units
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user