import aliases and put them in the scope

This commit is contained in:
Folkert 2020-10-30 19:59:09 +01:00
parent 58467d6515
commit 247071668e
2 changed files with 39 additions and 13 deletions

View File

@ -48,6 +48,7 @@ pub fn canonicalize_module_defs<'a>(
module_ids: &ModuleIds, module_ids: &ModuleIds,
exposed_ident_ids: IdentIds, exposed_ident_ids: IdentIds,
dep_idents: MutMap<ModuleId, IdentIds>, dep_idents: MutMap<ModuleId, IdentIds>,
aliases: MutMap<Symbol, Alias>,
exposed_imports: MutMap<Ident, (Symbol, Region)>, exposed_imports: MutMap<Ident, (Symbol, Region)>,
mut exposed_symbols: MutSet<Symbol>, mut exposed_symbols: MutSet<Symbol>,
var_store: &mut VarStore, var_store: &mut VarStore,
@ -56,6 +57,10 @@ pub fn canonicalize_module_defs<'a>(
let mut scope = Scope::new(home, var_store); let mut scope = Scope::new(home, var_store);
let num_deps = dep_idents.len(); let num_deps = dep_idents.len();
for (name, alias) in aliases.into_iter() {
scope.add_alias(name, alias.region, alias.vars, alias.typ);
}
// Desugar operators (convert them to Apply calls, taking into account // Desugar operators (convert them to Apply calls, taking into account
// operator precedence and associativity rules), before doing other canonicalization. // operator precedence and associativity rules), before doing other canonicalization.
// //

View File

@ -97,6 +97,10 @@ impl Dependencies {
// otherwise, we don't know whether an imported symbol is actually exposed // otherwise, we don't know whether an imported symbol is actually exposed
self.add_dependency_help(module_id, dep, Phase::Parse, Phase::LoadHeader); self.add_dependency_help(module_id, dep, Phase::Parse, Phase::LoadHeader);
// to canonicalize a module, all its dependencies must be canonicalized
self.add_dependency(module_id, dep, Phase::CanonicalizeAndConstrain);
// to typecheck a module, all its dependencies must be type checked already
self.add_dependency(module_id, dep, Phase::SolveTypes); self.add_dependency(module_id, dep, Phase::SolveTypes);
if goal_phase >= FindSpecializations { if goal_phase >= FindSpecializations {
@ -200,6 +204,7 @@ struct ModuleCache<'a> {
headers: MutMap<ModuleId, ModuleHeader<'a>>, headers: MutMap<ModuleId, ModuleHeader<'a>>,
parsed: MutMap<ModuleId, ParsedModule<'a>>, parsed: MutMap<ModuleId, ParsedModule<'a>>,
canonicalized: MutMap<ModuleId, CanonicalizedModule<'a>>, canonicalized: MutMap<ModuleId, CanonicalizedModule<'a>>,
aliases: MutMap<ModuleId, MutMap<Symbol, Alias>>,
constrained: MutMap<ModuleId, ConstrainedModule<'a>>, constrained: MutMap<ModuleId, ConstrainedModule<'a>>,
typechecked: MutMap<ModuleId, TypeCheckedModule<'a>>, typechecked: MutMap<ModuleId, TypeCheckedModule<'a>>,
found_specializations: MutMap<ModuleId, FoundSpecializationsModule<'a>>, found_specializations: MutMap<ModuleId, FoundSpecializationsModule<'a>>,
@ -281,12 +286,29 @@ fn start_phase<'a>(module_id: ModuleId, phase: Phase, state: &mut State<'a>) ->
.remove(&module_id) .remove(&module_id)
.expect("Could not find listener ID in exposed_symbols_by_module"); .expect("Could not find listener ID in exposed_symbols_by_module");
let mut aliases = MutMap::default();
for imported in parsed.imported_modules.iter() {
match state.module_cache.aliases.get(imported) {
None => unreachable!(
"imported module {:?} did not register its aliases, so {:?} cannot use them",
imported,
parsed.module_id,
),
Some(new) => {
// TODO filter to only add imported aliases
aliases.extend(new.iter().map(|(s, a)| (*s, a.clone())));
}
}
}
BuildTask::CanonicalizeAndConstrain { BuildTask::CanonicalizeAndConstrain {
parsed, parsed,
dep_idents, dep_idents,
exposed_symbols, exposed_symbols,
module_ids, module_ids,
mode: state.stdlib.mode, mode: state.stdlib.mode,
aliases,
} }
} }
@ -744,6 +766,7 @@ enum BuildTask<'a> {
dep_idents: IdentIdsByModule, dep_idents: IdentIdsByModule,
mode: Mode, mode: Mode,
exposed_symbols: MutSet<Symbol>, exposed_symbols: MutSet<Symbol>,
aliases: MutMap<Symbol, Alias>,
}, },
Solve { Solve {
module: Module, module: Module,
@ -1142,7 +1165,8 @@ where
// Needed to prevent a borrow checker error about this closure // Needed to prevent a borrow checker error about this closure
// outliving its enclosing function. // outliving its enclosing function.
drop(worker_msg_rx); drop(worker_msg_rx);
}); })
.unwrap();
} }
let mut state = State { let mut state = State {
@ -1329,18 +1353,6 @@ fn update<'a>(
Ok(state) Ok(state)
} }
// CanonicalizedAndConstrained {
// module,
// declarations,
// src,
// ident_ids,
// imported_modules,
// constraint,
// problems,
// var_store,
// module_timing,
// module_docs,
// } => {
CanonicalizedAndConstrained { CanonicalizedAndConstrained {
constrained_module, constrained_module,
canonicalization_problems, canonicalization_problems,
@ -1355,6 +1367,11 @@ fn update<'a>(
.documentation .documentation
.insert(module_id, module_docs); .insert(module_id, module_docs);
state
.module_cache
.aliases
.insert(module_id, constrained_module.module.aliases.clone());
state state
.module_cache .module_cache
.constrained .constrained
@ -2089,6 +2106,7 @@ fn canonicalize_and_constrain<'a>(
module_ids: &ModuleIds, module_ids: &ModuleIds,
dep_idents: IdentIdsByModule, dep_idents: IdentIdsByModule,
exposed_symbols: MutSet<Symbol>, exposed_symbols: MutSet<Symbol>,
aliases: MutMap<Symbol, Alias>,
mode: Mode, mode: Mode,
parsed: ParsedModule<'a>, parsed: ParsedModule<'a>,
) -> Result<Msg<'a>, LoadingProblem> { ) -> Result<Msg<'a>, LoadingProblem> {
@ -2119,6 +2137,7 @@ fn canonicalize_and_constrain<'a>(
module_ids, module_ids,
exposed_ident_ids, exposed_ident_ids,
dep_idents, dep_idents,
aliases,
exposed_imports, exposed_imports,
exposed_symbols, exposed_symbols,
&mut var_store, &mut var_store,
@ -2499,11 +2518,13 @@ fn run_task<'a>(
dep_idents, dep_idents,
mode, mode,
exposed_symbols, exposed_symbols,
aliases,
} => canonicalize_and_constrain( } => canonicalize_and_constrain(
arena, arena,
&module_ids, &module_ids,
dep_idents, dep_idents,
exposed_symbols, exposed_symbols,
aliases,
mode, mode,
parsed, parsed,
), ),