mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 22:34:45 +00:00
improve tag union errors
This commit is contained in:
parent
3f4346f573
commit
67f8f2e943
4 changed files with 222 additions and 24 deletions
|
@ -457,16 +457,36 @@ fn unify_tag_union(
|
|||
let sub1 = fresh(subs, pool, ctx, Structure(flat_type1));
|
||||
let sub2 = fresh(subs, pool, ctx, Structure(flat_type2));
|
||||
|
||||
// NOTE: for clearer error messages, we rollback unification of the ext vars when either fails
|
||||
//
|
||||
// This is inspired by
|
||||
//
|
||||
//
|
||||
// f : [ Red, Green ] -> Bool
|
||||
// f = \_ -> True
|
||||
//
|
||||
// f Blue
|
||||
//
|
||||
// In this case, we want the mismatch to be between `[ Blue ]a` and `[ Red, Green ]`, but
|
||||
// without rolling back, the mismatch is between `[ Blue, Red, Green ]a` and `[ Red, Green ]`.
|
||||
// TODO is this also required for the other cases?
|
||||
|
||||
let snapshot = subs.snapshot();
|
||||
|
||||
let ext1_problems = unify_pool(subs, pool, rec1.ext, sub2);
|
||||
if !ext1_problems.is_empty() {
|
||||
subs.rollback_to(snapshot);
|
||||
return ext1_problems;
|
||||
}
|
||||
|
||||
let ext2_problems = unify_pool(subs, pool, sub1, rec2.ext);
|
||||
if !ext2_problems.is_empty() {
|
||||
subs.rollback_to(snapshot);
|
||||
return ext2_problems;
|
||||
}
|
||||
|
||||
subs.commit_snapshot(snapshot);
|
||||
|
||||
let mut tag_problems =
|
||||
unify_shared_tags(subs, pool, ctx, shared_tags, other_tags, ext, recursion_var);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue