Revert "Revert "Use exists_with_aliases more""

This reverts commit 3e60a7b8ad.
This commit is contained in:
Folkert 2020-02-22 18:00:10 +01:00
parent 8d39db305f
commit e3db35154d
3 changed files with 37 additions and 17 deletions

View File

@ -680,29 +680,42 @@ fn constrain_empty_record(region: Region, expected: Expected<Type>) -> Constrain
/// Constrain top-level module declarations /// Constrain top-level module declarations
#[inline(always)] #[inline(always)]
pub fn constrain_decls(home: ModuleId, decls: &[Declaration]) -> Constraint { pub fn constrain_decls(
home: ModuleId,
decls: &[Declaration],
aliases: SendMap<Symbol, Alias>,
) -> Constraint {
let mut constraint = Constraint::SaveTheEnvironment; let mut constraint = Constraint::SaveTheEnvironment;
for decl in decls.iter().rev() { for decl in decls.iter().rev() {
// NOTE: rigids are empty because they are not shared between top-level definitions // NOTE: rigids are empty because they are not shared between top-level definitions
match decl { match decl {
Declaration::Declare(def) => { Declaration::Declare(def) => {
constraint = constrain_def( constraint = exists_with_aliases(
&Env { aliases.clone(),
home, Vec::new(),
rigids: ImMap::default(), constrain_def(
}, &Env {
def, home,
constraint, rigids: ImMap::default(),
},
def,
constraint,
),
); );
} }
Declaration::DeclareRec(defs) => { Declaration::DeclareRec(defs) => {
constraint = constrain_recursive_defs( constraint = exists_with_aliases(
&Env { aliases.clone(),
home, Vec::new(),
rigids: ImMap::default(), constrain_recursive_defs(
}, &Env {
defs, home,
constraint, rigids: ImMap::default(),
},
defs,
constraint,
),
); );
} }
Declaration::InvalidCycle(_, _) => panic!("TODO handle invalid cycle"), Declaration::InvalidCycle(_, _) => panic!("TODO handle invalid cycle"),

View File

@ -12,8 +12,15 @@ use crate::types::{Alias, Constraint, LetConstraint, Type};
pub fn constrain_module( pub fn constrain_module(
home: ModuleId, home: ModuleId,
decls: &[Declaration], decls: &[Declaration],
aliases: &MutMap<Symbol, Alias>,
) -> Constraint { ) -> Constraint {
constrain_decls(home, &decls) let mut send_aliases = SendMap::default();
for (symbol, alias) in aliases {
send_aliases.insert(*symbol, alias.clone());
}
constrain_decls(home, decls, send_aliases)
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]

View File

@ -1014,7 +1014,7 @@ fn parse_and_constrain(
problems, problems,
.. ..
}) => { }) => {
let constraint = constrain_module(module_id, &declarations); let constraint = constrain_module(module_id, &declarations, &aliases);
let module = Module { let module = Module {
module_id, module_id,
declarations, declarations,