mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 00:24:34 +00:00
Generate glue for Set
This commit is contained in:
parent
0f179272d9
commit
0b54f08f7f
5 changed files with 64 additions and 29 deletions
|
@ -946,15 +946,14 @@ fn add_builtin_type<'a>(
|
|||
Layout::Struct { field_layouts, .. },
|
||||
Content::Structure(FlatType::Apply(Symbol::LIST_LIST, args_subs_slice)),
|
||||
) => {
|
||||
let args_tuple = env.subs.get_subs_slice(*args_subs_slice);
|
||||
let (key_var, val_var) = {
|
||||
let args_tuple = env.subs.get_subs_slice(*args_subs_slice);
|
||||
|
||||
debug_assert_eq!(args_tuple.len(), 1);
|
||||
debug_assert_eq!(args_tuple.len(), 1);
|
||||
|
||||
let (key_var, val_var) =
|
||||
match env.subs.get_content_without_compacting(args_tuple[0]) {
|
||||
Content::Structure(FlatType::TagUnion(union_tags, ext_var)) => {
|
||||
let (mut iter, _) =
|
||||
union_tags.sorted_iterator_and_ext(env.subs, *ext_var);
|
||||
let (mut iter, _) = union_tags.sorted_iterator_and_ext(env.subs, *ext_var);
|
||||
let payloads = iter.next().unwrap().1;
|
||||
|
||||
debug_assert_eq!(iter.next(), None);
|
||||
|
@ -964,7 +963,8 @@ fn add_builtin_type<'a>(
|
|||
_ => {
|
||||
unreachable!()
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
debug_assert_eq!(field_layouts.len(), 2);
|
||||
|
||||
|
@ -977,14 +977,47 @@ fn add_builtin_type<'a>(
|
|||
|
||||
dict_id
|
||||
}
|
||||
_ => unreachable!("Unrecognized List element for Dict: {:?}", elem_layout),
|
||||
(elem_layout, alias_content) => unreachable!(
|
||||
"Unrecognized List element for Dict. Layout was: {:?} and alias_content was: {:?}",
|
||||
elem_layout,
|
||||
alias_content
|
||||
),
|
||||
}
|
||||
}
|
||||
(
|
||||
Builtin::List(_elem_layout),
|
||||
Alias(Symbol::SET_SET, _alias_vars, _alias_var, _alias_kind),
|
||||
Builtin::List(elem_layout),
|
||||
Alias(Symbol::SET_SET, _alias_vars, alias_var, AliasKind::Opaque),
|
||||
) => {
|
||||
todo!();
|
||||
match (
|
||||
elem_layout,
|
||||
env.subs.get_content_without_compacting(*alias_var),
|
||||
) {
|
||||
(
|
||||
Layout::Struct { field_layouts, .. },
|
||||
Alias(Symbol::DICT_DICT, alias_args, _alias_var, AliasKind::Opaque),
|
||||
) => {
|
||||
let dict_type_vars = env.subs.get_subs_slice(alias_args.type_variables());
|
||||
|
||||
debug_assert_eq!(dict_type_vars.len(), 2);
|
||||
|
||||
// Sets only use the key of the Dict they wrap, not the value
|
||||
let elem_var = dict_type_vars[0];
|
||||
|
||||
debug_assert_eq!(field_layouts.len(), 2);
|
||||
|
||||
let elem_id = add_type_help(env, field_layouts[0], elem_var, opt_name, types);
|
||||
let set_id = types.add_anonymous(RocType::RocSet(elem_id), layout);
|
||||
|
||||
types.depends(set_id, elem_id);
|
||||
|
||||
set_id
|
||||
}
|
||||
(elem_layout, alias_content) => unreachable!(
|
||||
"Unrecognized List element for Set. Layout was: {:?} and alias_content was: {:?}",
|
||||
elem_layout,
|
||||
alias_content
|
||||
),
|
||||
}
|
||||
}
|
||||
(Builtin::List(elem_layout), alias) => {
|
||||
unreachable!(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue