mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 14:24:45 +00:00
refactor
This commit is contained in:
parent
62a82d1135
commit
0ba612ecdb
1 changed files with 13 additions and 40 deletions
|
@ -347,46 +347,25 @@ pub fn constrain_expr(
|
||||||
} => {
|
} => {
|
||||||
// NOTE defs are treated somewhere else!
|
// NOTE defs are treated somewhere else!
|
||||||
let loc_body_expr = &**boxed;
|
let loc_body_expr = &**boxed;
|
||||||
let mut state = PatternState {
|
|
||||||
headers: SendMap::default(),
|
|
||||||
vars: Vec::with_capacity(arguments.len()),
|
|
||||||
constraints: Vec::with_capacity(1),
|
|
||||||
};
|
|
||||||
let mut vars = Vec::with_capacity(state.vars.capacity() + 1);
|
|
||||||
let mut pattern_types = Vec::with_capacity(state.vars.capacity());
|
|
||||||
let ret_var = *ret_var;
|
let ret_var = *ret_var;
|
||||||
let closure_var = *closure_var;
|
let closure_var = *closure_var;
|
||||||
let closure_ext_var = *closure_ext_var;
|
let closure_ext_var = *closure_ext_var;
|
||||||
let ret_type = Type::Variable(ret_var);
|
|
||||||
|
let closure_type = Type::Variable(closure_var);
|
||||||
|
let return_type = Type::Variable(ret_var);
|
||||||
|
let (mut vars, pattern_state, function_type) =
|
||||||
|
constrain_untyped_args(env, arguments, closure_type, return_type.clone());
|
||||||
|
|
||||||
vars.push(ret_var);
|
vars.push(ret_var);
|
||||||
vars.push(closure_var);
|
vars.push(closure_var);
|
||||||
vars.push(closure_ext_var);
|
vars.push(closure_ext_var);
|
||||||
|
vars.push(*fn_var);
|
||||||
|
|
||||||
for (pattern_var, loc_pattern) in arguments {
|
let body_type = NoExpectation(return_type.clone());
|
||||||
let pattern_type = Type::Variable(*pattern_var);
|
|
||||||
let pattern_expected = PExpected::NoExpectation(pattern_type.clone());
|
|
||||||
|
|
||||||
pattern_types.push(pattern_type);
|
|
||||||
|
|
||||||
constrain_pattern(
|
|
||||||
env,
|
|
||||||
&loc_pattern.value,
|
|
||||||
loc_pattern.region,
|
|
||||||
pattern_expected,
|
|
||||||
&mut state,
|
|
||||||
);
|
|
||||||
|
|
||||||
vars.push(*pattern_var);
|
|
||||||
}
|
|
||||||
|
|
||||||
let body_type = NoExpectation(ret_type.clone());
|
|
||||||
let ret_constraint =
|
let ret_constraint =
|
||||||
constrain_expr(env, loc_body_expr.region, &loc_body_expr.value, body_type);
|
constrain_expr(env, loc_body_expr.region, &loc_body_expr.value, body_type);
|
||||||
|
|
||||||
vars.push(*fn_var);
|
|
||||||
let defs_constraint = And(state.constraints);
|
|
||||||
|
|
||||||
// make sure the captured symbols are sorted!
|
// make sure the captured symbols are sorted!
|
||||||
debug_assert_eq!(captured_symbols.clone(), {
|
debug_assert_eq!(captured_symbols.clone(), {
|
||||||
let mut copy = captured_symbols.clone();
|
let mut copy = captured_symbols.clone();
|
||||||
|
@ -403,28 +382,22 @@ pub fn constrain_expr(
|
||||||
&mut vars,
|
&mut vars,
|
||||||
);
|
);
|
||||||
|
|
||||||
let fn_type = Type::Function(
|
|
||||||
pattern_types,
|
|
||||||
Box::new(Type::Variable(closure_var)),
|
|
||||||
Box::new(ret_type),
|
|
||||||
);
|
|
||||||
|
|
||||||
exists(
|
exists(
|
||||||
vars,
|
vars,
|
||||||
And(vec![
|
And(vec![
|
||||||
Let(Box::new(LetConstraint {
|
Let(Box::new(LetConstraint {
|
||||||
rigid_vars: Vec::new(),
|
rigid_vars: Vec::new(),
|
||||||
flex_vars: state.vars,
|
flex_vars: pattern_state.vars,
|
||||||
def_types: state.headers,
|
def_types: pattern_state.headers,
|
||||||
defs_constraint,
|
defs_constraint: And(pattern_state.constraints),
|
||||||
ret_constraint,
|
ret_constraint,
|
||||||
})),
|
})),
|
||||||
// "the closure's type is equal to expected type"
|
// "the closure's type is equal to expected type"
|
||||||
Eq(fn_type.clone(), expected, Category::Lambda, region),
|
Eq(function_type.clone(), expected, Category::Lambda, region),
|
||||||
// "fn_var is equal to the closure's type" - fn_var is used in code gen
|
// "fn_var is equal to the closure's type" - fn_var is used in code gen
|
||||||
Eq(
|
Eq(
|
||||||
Type::Variable(*fn_var),
|
Type::Variable(*fn_var),
|
||||||
NoExpectation(fn_type),
|
NoExpectation(function_type),
|
||||||
Category::Storage(std::file!(), std::line!()),
|
Category::Storage(std::file!(), std::line!()),
|
||||||
region,
|
region,
|
||||||
),
|
),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue