fix: the final clause of a when expecting another clause afterwards in nested list cases.

fix: all elements were being destructured in tuple clauses even if not used
This commit is contained in:
microproofs
2023-06-19 20:32:11 -04:00
committed by Kasey
parent e1f788b628
commit 24f5c4de6b
3 changed files with 65 additions and 36 deletions

View File

@@ -1163,6 +1163,11 @@ impl<'a> CodeGenerator<'a> {
pattern_stack.merge_child(value_stack);
}
}
// final clause can not be complex
if *(clause_properties.is_final_clause()) {
*clause_properties.is_complex_clause() = false;
}
}
fn expose_elements(
@@ -1375,20 +1380,24 @@ impl<'a> CodeGenerator<'a> {
pattern_stack.merge_child(nested_pattern);
}
Pattern::Tuple { elems, .. } => {
let mut names = vec![];
let mut nested_pattern = pattern_stack.empty_with_scope();
let items_type = &tipo.get_inner_types();
for (index, element) in elems.iter().enumerate() {
let name = self.nested_pattern_ir_and_label(
element,
&mut nested_pattern,
&items_type[index],
*clause_properties.is_final_clause(),
);
let names = elems
.iter()
.enumerate()
.filter_map(|(index, element)| {
let name = self.nested_pattern_ir_and_label(
element,
&mut nested_pattern,
&items_type[index],
*clause_properties.is_final_clause(),
);
name.map(|name| (name, index))
})
.collect_vec();
names.push((name.unwrap_or_else(|| "_".to_string()), index))
}
let mut defined_indices = match clause_properties.clone() {
ClauseProperties::TupleClause {
defined_tuple_indices,
@@ -1456,6 +1465,11 @@ impl<'a> CodeGenerator<'a> {
let new_tail_name = "__tail".to_string();
if elements.is_empty() {
assert!(
!final_clause,
"Why do you have a last clause with [] in it?"
);
let mut void_stack = pattern_stack.empty_with_scope();
void_stack.void();
@@ -1498,13 +1512,17 @@ impl<'a> CodeGenerator<'a> {
&mut clause_properties,
);
pattern_stack.list_clause_guard(
pattern_type.clone().into(),
prev_tail_name,
None,
true,
elements_stack,
);
if !final_clause {
pattern_stack.list_clause_guard(
pattern_type.clone().into(),
prev_tail_name,
None,
true,
elements_stack,
);
} else {
pattern_stack.finally(elements_stack)
}
} else {
let mut elements_stack = pattern_stack.empty_with_scope();
@@ -1520,23 +1538,27 @@ impl<'a> CodeGenerator<'a> {
&mut clause_properties,
);
void_stack.list_clause_guard(
pattern_type.clone().into(),
&tail_name,
None,
false,
elements_stack,
);
if !final_clause {
void_stack.list_clause_guard(
pattern_type.clone().into(),
&tail_name,
None,
false,
elements_stack,
);
pattern_stack.list_clause_guard(
pattern_type.clone().into(),
prev_tail_name,
Some(tail_name),
true,
void_stack,
);
pattern_stack.list_clause_guard(
pattern_type.clone().into(),
prev_tail_name,
Some(tail_name),
true,
void_stack,
);
} else {
pattern_stack.finally(elements_stack);
}
}
} else {
} else if !final_clause {
let mut void_stack = pattern_stack.empty_with_scope();
void_stack.void();