Improve import system functions, fix bugs

This commit is contained in:
LunaAmora 2024-07-03 02:00:34 -03:00
parent 8e289f6aec
commit 71019540d4
3 changed files with 58 additions and 40 deletions

View File

@ -94,14 +94,13 @@ impl DefaultLoader {
) -> Result<Option<(BoundSource, Sources)>, String> {
let full_path = base_path.join(path.as_ref());
let mut src = IndexMap::new();
let (mut file, mut dir) = (None, None);
let file = if full_path.with_extension("bend").is_file() {
self.read_file(&full_path, path.as_ref(), &mut src)?
} else {
None
};
if full_path.with_extension("bend").is_file() {
file = self.read_file(&full_path, path.as_ref(), &mut src)?;
}
let dir = if full_path.is_dir() || path.is_empty() {
if full_path.is_dir() || path.is_empty() {
let mut names = IndexMap::new();
match imp_type {
@ -131,14 +130,10 @@ impl DefaultLoader {
}
}
if names.is_empty() {
None
} else {
Some(names)
if !names.is_empty() {
dir = Some(names);
}
} else {
None
};
}
let src = match (file, dir) {
(Some(f), None) => Some((BoundSource::File(f), src)),

View File

@ -117,35 +117,38 @@ impl ImportsMap {
}
}
fn add_aliased_binds(&mut self, names: &[(Name, Option<Name>)], src: &Name, diag: &mut Diagnostics) {
for (sub, alias) in names {
self.add_aliased_bind(src, sub, alias.as_ref(), diag);
}
}
/// Adds all names to the ImportMap in the form `alias/name`.
/// If one of the names is equal to the non-aliased name, adds as `alias` instead.
fn add_nested_binds(
/// If one of the names is equal to the file name, adds as `alias` instead.
fn add_file_nested_binds(
&mut self,
src: &Name,
nam: &Name,
file: &Name,
alias: Option<&Name>,
names: IndexSet<Name>,
diag: &mut Diagnostics,
) {
let aliased = alias.unwrap_or(nam);
let aliased = alias.unwrap_or(file);
for name in &names {
if name != nam {
let src = format!("{}/{}", src, name);
let bind = Name::new(format!("{aliased}/{name}"));
self.add_bind(&src, bind, diag);
}
}
self.add_nested_binds(src, aliased, names.iter().filter(|&n| n != file), diag);
if names.contains(nam) {
let src = format!("{}/{}", src, nam);
if names.contains(file) {
let src = format!("{}/{}", src, file);
self.add_bind(&src, aliased.clone(), diag);
}
}
/// Adds all names to the ImportMap in the form `bind/name`.
fn add_nested_binds<'a>(
&mut self,
src: &Name,
bind: &Name,
names: impl Iterator<Item = &'a Name>,
diag: &mut Diagnostics,
) {
for name in names {
let src = format!("{}/{}", src, name);
let bind = Name::new(format!("{bind}/{name}"));
self.add_bind(&src, bind, diag);
}
}
}

View File

@ -119,7 +119,7 @@ impl Packages {
}
pkgs.insert(name.clone(), src.clone());
map.add_aliased_bind(src, name, alias.as_ref(), diag)
self.add_aliased_bind(src, name, alias, map, diag);
}
}
@ -153,14 +153,14 @@ impl Packages {
import.src = BoundSource::Dir(std::mem::take(pkgs));
}
(BoundSource::File(src), ImportType::Single(nam, alias)) => {
if !self.unique_top_level_names(src).contains(nam) {
let err = format!("Package '{src}' does not contain the top level name '{nam}'");
(BoundSource::File(src), ImportType::Single(name, alias)) => {
if !self.unique_top_level_names(src).contains(name) {
let err = format!("Package '{src}' does not contain the top level name '{name}'");
diag.add_book_error(err);
continue;
}
map.add_aliased_bind(src, nam, alias.as_ref(), diag)
self.add_aliased_bind(src, name, alias, map, diag);
}
(BoundSource::File(src), ImportType::List(names)) => {
@ -179,7 +179,9 @@ impl Packages {
continue;
}
map.add_aliased_binds(names, src, diag);
for (name, alias) in names {
self.add_aliased_bind(src, name, alias, map, diag);
}
}
(BoundSource::File(src), ImportType::Glob) => {
@ -206,6 +208,24 @@ impl Packages {
}
}
fn add_aliased_bind(
&self,
src: &mut Name,
name: &Name,
alias: &Option<Name>,
map: &mut ImportsMap,
diag: &mut Diagnostics,
) {
let alias = alias.as_ref();
if let Some(adt) = self.books.get(src).unwrap().borrow().adts.get(name) {
let names = adt.ctrs.iter().map(|(n, _)| n);
map.add_nested_binds(src, alias.unwrap_or(name), names, diag);
}
map.add_aliased_bind(src, name, alias, diag);
}
fn add_file_from_dir(
&self,
pkgs: &IndexMap<Name, Name>,
@ -216,7 +236,7 @@ impl Packages {
) -> bool {
if let Some(src) = pkgs.get(nam) {
let names = self.unique_top_level_names(src);
map.add_nested_binds(src, nam, alias.as_ref(), names, diag);
map.add_file_nested_binds(src, nam, alias.as_ref(), names, diag);
true
} else {
false
@ -226,7 +246,7 @@ impl Packages {
fn add_glob_from_dir(&self, pkgs: &IndexMap<Name, Name>, map: &mut ImportsMap, diag: &mut Diagnostics) {
for (nam, src) in pkgs {
let names = self.unique_top_level_names(src);
map.add_nested_binds(src, nam, None, names, diag);
map.add_file_nested_binds(src, nam, None, names, diag);
}
}