Make imports relative to the file it is declared

This commit is contained in:
LunaAmora 2024-06-07 08:14:54 -03:00
parent 9f9b8d7ce1
commit d17ccc0544
2 changed files with 8 additions and 3 deletions

View File

@ -21,7 +21,7 @@ pub fn load_to_book<T: Display>(
let builtins = ParseBook::builtins();
let mut book = do_parse_book(code, origin, builtins)?;
book.imports.load_imports(&mut package_loader)?;
book.imports.load_imports(None, &mut package_loader)?;
book.apply_imports()?;
let mut book = book.to_fun()?;

View File

@ -30,13 +30,18 @@ impl Imports {
self.names
}
pub fn load_imports(&mut self, loader: &mut impl PackageLoader) -> Result<(), String> {
pub fn load_imports(&mut self, dir: Option<Name>, loader: &mut impl PackageLoader) -> Result<(), String> {
for (src, sub_imports) in &self.names {
// TODO: Would this be correct when handling non-local imports? Do we want relative online sources?
// TODO: Normalize paths when using `..`
let src = dir.as_ref().map_or(src.clone(), |p| Name::new(format!("{}/{}", p, src)));
let packages = loader.load(src.clone(), sub_imports)?;
for (psrc, code) in packages {
let mut module = do_parse_book(&code, &psrc, ParseBook::default())?;
module.imports.load_imports(loader)?;
let parent_dir = psrc.rsplit_once('/').map(|(s, _)| Name::new(s)).unwrap_or(psrc.clone());
module.imports.load_imports(Some(parent_dir), loader)?;
self.pkgs.push((psrc, module));
}