mirror of
https://github.com/roc-lang/roc.git
synced 2024-09-21 07:49:17 +03:00
import aliases and put them in the scope
This commit is contained in:
parent
58467d6515
commit
247071668e
@ -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.
|
||||||
//
|
//
|
||||||
|
@ -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,
|
||||||
),
|
),
|
||||||
|
Loading…
Reference in New Issue
Block a user