forked from Orchid/orchid
STL rework
- fixed lots of bugs - overlay libraries work correctly and reliably - the STL is an overlay library - examples updated
This commit is contained in:
@@ -3,14 +3,14 @@ use std::rc::Rc;
|
||||
use hashbrown::HashMap;
|
||||
|
||||
use super::alias_map::AliasMap;
|
||||
use super::decls::InjectedAsFn;
|
||||
use super::decls::{InjectedAsFn, UpdatedFn};
|
||||
use crate::ast::{Expr, Rule};
|
||||
use crate::interner::{Interner, Sym, Tok};
|
||||
use crate::pipeline::{ProjectExt, ProjectModule};
|
||||
use crate::representations::tree::{ModEntry, ModMember};
|
||||
use crate::utils::Substack;
|
||||
|
||||
fn resolve(
|
||||
fn resolve_rec(
|
||||
token: Sym,
|
||||
alias_map: &AliasMap,
|
||||
i: &Interner,
|
||||
@@ -18,7 +18,7 @@ fn resolve(
|
||||
if let Some(alias) = alias_map.resolve(token) {
|
||||
Some(i.r(alias).clone())
|
||||
} else if let Some((foot, body)) = i.r(token).split_last() {
|
||||
let mut new_beginning = resolve(i.i(body), alias_map, i)?;
|
||||
let mut new_beginning = resolve_rec(i.i(body), alias_map, i)?;
|
||||
new_beginning.push(*foot);
|
||||
Some(new_beginning)
|
||||
} else {
|
||||
@@ -26,6 +26,18 @@ fn resolve(
|
||||
}
|
||||
}
|
||||
|
||||
fn resolve(
|
||||
token: Sym,
|
||||
alias_map: &AliasMap,
|
||||
injected_as: &impl InjectedAsFn,
|
||||
i: &Interner,
|
||||
) -> Option<Sym> {
|
||||
injected_as(&i.r(token)[..]).or_else(|| {
|
||||
let next_v = resolve_rec(token, alias_map, i)?;
|
||||
Some(injected_as(&next_v).unwrap_or_else(|| i.i(&next_v)))
|
||||
})
|
||||
}
|
||||
|
||||
fn process_expr(
|
||||
expr: &Expr,
|
||||
alias_map: &AliasMap,
|
||||
@@ -33,16 +45,7 @@ fn process_expr(
|
||||
i: &Interner,
|
||||
) -> Expr {
|
||||
expr
|
||||
.map_names(&|n| {
|
||||
injected_as(&i.r(n)[..]).or_else(|| {
|
||||
let next_v = resolve(n, alias_map, i)?;
|
||||
// println!("Resolved alias {} to {}",
|
||||
// i.extern_vec(n).join("::"),
|
||||
// i.extern_all(&next_v).join("::")
|
||||
// );
|
||||
Some(injected_as(&next_v).unwrap_or_else(|| i.i(&next_v)))
|
||||
})
|
||||
})
|
||||
.map_names(&|n| resolve(n, alias_map, injected_as, i))
|
||||
.unwrap_or_else(|| expr.clone())
|
||||
}
|
||||
|
||||
@@ -54,10 +57,9 @@ fn apply_aliases_rec(
|
||||
alias_map: &AliasMap,
|
||||
i: &Interner,
|
||||
injected_as: &impl InjectedAsFn,
|
||||
updated: &impl UpdatedFn,
|
||||
) -> ProjectModule {
|
||||
let items = module
|
||||
.items
|
||||
.iter()
|
||||
let items = (module.items.iter())
|
||||
.map(|(name, ent)| {
|
||||
let ModEntry { exported, member } = ent;
|
||||
let member = match member {
|
||||
@@ -65,9 +67,7 @@ fn apply_aliases_rec(
|
||||
ModMember::Item(process_expr(expr, alias_map, injected_as, i)),
|
||||
ModMember::Sub(module) => {
|
||||
let subpath = path.push(*name);
|
||||
let is_ignored =
|
||||
injected_as(&subpath.iter().rev_vec_clone()).is_some();
|
||||
let new_mod = if is_ignored {
|
||||
let new_mod = if !updated(&subpath.iter().rev_vec_clone()) {
|
||||
module.clone()
|
||||
} else {
|
||||
let module = module.as_ref();
|
||||
@@ -77,6 +77,7 @@ fn apply_aliases_rec(
|
||||
alias_map,
|
||||
i,
|
||||
injected_as,
|
||||
updated,
|
||||
))
|
||||
};
|
||||
ModMember::Sub(new_mod)
|
||||
@@ -85,23 +86,18 @@ fn apply_aliases_rec(
|
||||
(*name, ModEntry { exported: *exported, member })
|
||||
})
|
||||
.collect::<HashMap<_, _>>();
|
||||
let rules = module
|
||||
.extra
|
||||
.rules
|
||||
.iter()
|
||||
let rules = (module.extra.rules.iter())
|
||||
.map(|rule| {
|
||||
let Rule { pattern, prio, template } = rule;
|
||||
Rule {
|
||||
prio: *prio,
|
||||
pattern: Rc::new(
|
||||
pattern
|
||||
.iter()
|
||||
(pattern.iter())
|
||||
.map(|expr| process_expr(expr, alias_map, injected_as, i))
|
||||
.collect::<Vec<_>>(),
|
||||
),
|
||||
template: Rc::new(
|
||||
template
|
||||
.iter()
|
||||
(template.iter())
|
||||
.map(|expr| process_expr(expr, alias_map, injected_as, i))
|
||||
.collect::<Vec<_>>(),
|
||||
),
|
||||
@@ -113,7 +109,11 @@ fn apply_aliases_rec(
|
||||
imports: module.imports.clone(),
|
||||
extra: ProjectExt {
|
||||
rules,
|
||||
exports: module.extra.exports.clone(),
|
||||
exports: (module.extra.exports.iter())
|
||||
.map(|(k, v)| {
|
||||
(*k, resolve(*v, alias_map, injected_as, i).unwrap_or(*v))
|
||||
})
|
||||
.collect(),
|
||||
file: module.extra.file.clone(),
|
||||
imports_from: module.extra.imports_from.clone(),
|
||||
},
|
||||
@@ -125,6 +125,14 @@ pub fn apply_aliases(
|
||||
alias_map: &AliasMap,
|
||||
i: &Interner,
|
||||
injected_as: &impl InjectedAsFn,
|
||||
updated: &impl UpdatedFn,
|
||||
) -> ProjectModule {
|
||||
apply_aliases_rec(Substack::Bottom, module, alias_map, i, injected_as)
|
||||
apply_aliases_rec(
|
||||
Substack::Bottom,
|
||||
module,
|
||||
alias_map,
|
||||
i,
|
||||
injected_as,
|
||||
updated,
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user