mirror of
https://github.com/roc-lang/roc.git
synced 2024-09-22 08:17:40 +03:00
Revert "Revert "Use exists_with_aliases more""
This reverts commit 3e60a7b8ad
.
This commit is contained in:
parent
8d39db305f
commit
e3db35154d
@ -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"),
|
||||||
|
@ -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)]
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user