mirror of
https://github.com/HigherOrderCO/Bend.git
synced 2024-10-05 15:57:08 +03:00
Improve import system functions, fix bugs
This commit is contained in:
parent
8e289f6aec
commit
71019540d4
@ -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)),
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user