Propogate only_unseen phanton type count check

This commit is contained in:
Ayaz Hafiz 2022-11-16 19:46:54 -06:00
parent 48c0921cd2
commit fe0eacb70a
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
2 changed files with 21 additions and 19 deletions

View file

@ -2434,24 +2434,24 @@ fn count_generated_name_usages<'a>(
debug_assert!(!is_generated_name(name)); debug_assert!(!is_generated_name(name));
} }
Type(_, tys) => { Type(_, tys) => {
stack.extend(tys.iter().map(|t| (t, false))); stack.extend(tys.iter().map(|t| (t, only_unseen)));
} }
Record(fields, ext) => { Record(fields, ext) => {
stack.extend(fields.values().map(|f| (f.as_inner(), false))); stack.extend(fields.values().map(|f| (f.as_inner(), only_unseen)));
ext_stack.push(ext); ext_stack.push((ext, only_unseen));
} }
TagUnion(tags, ext, _) => { TagUnion(tags, ext, _) => {
stack.extend(tags.values().flatten().map(|t| (t, false))); stack.extend(tags.values().flatten().map(|t| (t, only_unseen)));
ext_stack.push(ext); ext_stack.push((ext, only_unseen));
} }
RecursiveTagUnion(rec, tags, ext, _) => { RecursiveTagUnion(rec, tags, ext, _) => {
stack.push((rec, false)); stack.push((rec, only_unseen));
stack.extend(tags.values().flatten().map(|t| (t, false))); stack.extend(tags.values().flatten().map(|t| (t, only_unseen)));
ext_stack.push(ext); ext_stack.push((ext, only_unseen));
} }
Function(args, _lset, ret) => { Function(args, _lset, ret) => {
stack.extend(args.iter().map(|t| (t, false))); stack.extend(args.iter().map(|t| (t, only_unseen)));
stack.push((ret, false)); stack.push((ret, only_unseen));
} }
Alias(_, args, real, _) => { Alias(_, args, real, _) => {
// Then, count up any phantom args that were missed b/c they're not referenced in // Then, count up any phantom args that were missed b/c they're not referenced in
@ -2460,7 +2460,7 @@ fn count_generated_name_usages<'a>(
stack.extend(args.iter().map(|t| (t, true))); stack.extend(args.iter().map(|t| (t, true)));
// First, count the occurrences in the real var // First, count the occurrences in the real var
stack.push((real, false)); stack.push((real, only_unseen));
} }
Infinite | Error => {} Infinite | Error => {}
Range(_) => {} Range(_) => {}
@ -2472,16 +2472,18 @@ fn count_generated_name_usages<'a>(
fn count_generated_name_usages_in_exts<'a>( fn count_generated_name_usages_in_exts<'a>(
usages: &mut VecMap<Lowercase, usize>, usages: &mut VecMap<Lowercase, usize>,
exts: impl IntoIterator<Item = &'a TypeExt>, exts: impl IntoIterator<Item = (&'a TypeExt, bool)>,
) { ) {
for ext in exts { for (ext, only_unseen) in exts {
match ext { match ext {
TypeExt::FlexOpen(name) => { TypeExt::FlexOpen(name) => {
if is_generated_name(name) { if is_generated_name(name) {
let count = usages.get_or_insert(name.clone(), || 0); let count = usages.get_or_insert(name.clone(), || 0);
if !only_unseen || *count == 0 {
*count += 1; *count += 1;
} }
} }
}
TypeExt::RigidOpen(name) => { TypeExt::RigidOpen(name) => {
debug_assert!(!is_generated_name(name)); debug_assert!(!is_generated_name(name));
} }
@ -3102,13 +3104,13 @@ fn diff_tag_union<'b>(
let gen_usages1 = { let gen_usages1 = {
let mut usages = VecMap::default(); let mut usages = VecMap::default();
count_generated_name_usages(&mut usages, fields1.values().flatten()); count_generated_name_usages(&mut usages, fields1.values().flatten());
count_generated_name_usages_in_exts(&mut usages, [&ext1]); count_generated_name_usages_in_exts(&mut usages, [(&ext1, false)]);
usages usages
}; };
let gen_usages2 = { let gen_usages2 = {
let mut usages = VecMap::default(); let mut usages = VecMap::default();
count_generated_name_usages(&mut usages, fields2.values().flatten()); count_generated_name_usages(&mut usages, fields2.values().flatten());
count_generated_name_usages_in_exts(&mut usages, [&ext2]); count_generated_name_usages_in_exts(&mut usages, [(&ext2, false)]);
usages usages
}; };

View file

@ -1330,7 +1330,7 @@ mod test_reporting {
This `bar` value is a: This `bar` value is a:
{ bar : Int a } { bar : Int * }
But `f` needs its 1st argument to be: But `f` needs its 1st argument to be:
@ -1398,7 +1398,7 @@ mod test_reporting {
This `Blue` tag application has the type: This `Blue` tag application has the type:
[Blue (Frac a)] [Blue (Frac *)]
But `f` needs its 1st argument to be: But `f` needs its 1st argument to be:
@ -2788,7 +2788,7 @@ mod test_reporting {
The argument is a record of type: The argument is a record of type:
{ y : Frac a } { y : Frac * }
But `f` needs its 1st argument to be: But `f` needs its 1st argument to be: