some more fixes involving clauses

This commit is contained in:
microproofs 2023-07-28 14:48:18 -04:00 committed by Kasey
parent a689b8748f
commit 02948616cd
1 changed files with 19 additions and 4 deletions

View File

@ -727,7 +727,7 @@ impl<'a> CodeGenerator<'a> {
let val = AirTree::local_var(name, tipo.clone()); let val = AirTree::local_var(name, tipo.clone());
if non_opaque_tipo.is_primitive() { if non_opaque_tipo.is_primitive() {
assignment.hoist_over(val) assignment
} else { } else {
let expect = self.expect_type_assign( let expect = self.expect_type_assign(
&non_opaque_tipo, &non_opaque_tipo,
@ -1569,7 +1569,20 @@ impl<'a> CodeGenerator<'a> {
props.original_subject_name.clone(), props.original_subject_name.clone(),
); );
if let Some(data_type) = data_type { if matches!(
&clause.pattern,
Pattern::Var { .. } | Pattern::Discard { .. }
) {
AirTree::wrap_clause(
clause_assign_hoisted,
self.handle_each_clause(
rest_clauses,
final_clause,
subject_tipo,
&mut next_clause_props,
),
)
} else if let Some(data_type) = data_type {
if data_type.constructors.len() > 1 { if data_type.constructors.len() > 1 {
AirTree::clause( AirTree::clause(
&props.original_subject_name, &props.original_subject_name,
@ -1679,7 +1692,8 @@ impl<'a> CodeGenerator<'a> {
let next_elements_len = match next_clause_pattern { let next_elements_len = match next_clause_pattern {
Pattern::List { elements, tail, .. } => { Pattern::List { elements, tail, .. } => {
elements.len() + usize::from(tail.is_none()) assert!(!elements.is_empty() || tail.is_none());
elements.len() + usize::from(tail.is_none()) - 1
} }
_ => 0, _ => 0,
}; };
@ -1711,7 +1725,8 @@ impl<'a> CodeGenerator<'a> {
is_wild_card_elems_clause = is_wild_card_elems_clause =
is_wild_card_elems_clause && !pattern_has_conditions(element); is_wild_card_elems_clause && !pattern_has_conditions(element);
} }
let elements_len = elements.len() + usize::from(tail.is_none()); assert!(!elements.is_empty() || tail.is_none());
let elements_len = elements.len() + usize::from(tail.is_none()) - 1;
let current_checked_index = *checked_index; let current_checked_index = *checked_index;
if *checked_index < elements_len.try_into().unwrap() if *checked_index < elements_len.try_into().unwrap()