fix: tuples and list patterns had a few issues

This commit is contained in:
microproofs 2023-07-26 11:33:47 -04:00 committed by Kasey
parent 960a15c4ec
commit 2f4319f162
1 changed files with 26 additions and 7 deletions

View File

@ -197,8 +197,8 @@ impl<'a> CodeGenerator<'a> {
term, term,
}; };
program = aiken_optimize_and_intern(program);
println!("Program: {}", program.to_pretty()); println!("Program: {}", program.to_pretty());
program = aiken_optimize_and_intern(program);
// This is very important to call here. // This is very important to call here.
// If this isn't done, re-using the same instance // If this isn't done, re-using the same instance
@ -1869,7 +1869,7 @@ impl<'a> CodeGenerator<'a> {
defined_heads.push(elem_name) defined_heads.push(elem_name)
}); });
let list_assign = if props.final_clause { let list_assign = if props.final_clause && defined_tails.is_empty() {
AirTree::list_access( AirTree::list_access(
defined_heads, defined_heads,
subject_tipo.clone(), subject_tipo.clone(),
@ -1882,6 +1882,7 @@ impl<'a> CodeGenerator<'a> {
defined_heads defined_heads
.into_iter() .into_iter()
.zip(defined_tails.into_iter()) .zip(defined_tails.into_iter())
.map(|(head, tail)| (tail, head))
.collect_vec(), .collect_vec(),
list_tail, list_tail,
subject_tipo.clone(), subject_tipo.clone(),
@ -2062,6 +2063,7 @@ impl<'a> CodeGenerator<'a> {
}; };
let mut previous_defined_names = vec![]; let mut previous_defined_names = vec![];
let mut names_to_define = vec![];
name_index_assigns.iter().for_each(|(name, index, _)| { name_index_assigns.iter().for_each(|(name, index, _)| {
if let Some((index, prev_name)) = defined_indices if let Some((index, prev_name)) = defined_indices
.iter() .iter()
@ -2070,6 +2072,7 @@ impl<'a> CodeGenerator<'a> {
previous_defined_names.push((*index, prev_name.clone(), name.clone())); previous_defined_names.push((*index, prev_name.clone(), name.clone()));
} else if name != "_" { } else if name != "_" {
assert!(defined_indices.insert((*index, name.clone()))); assert!(defined_indices.insert((*index, name.clone())));
names_to_define.push((*index, name.clone()));
} }
}); });
@ -2104,12 +2107,30 @@ impl<'a> CodeGenerator<'a> {
let mut sequence = tuple_name_assigns; let mut sequence = tuple_name_assigns;
sequence.append(&mut tuple_item_assigns); sequence.append(&mut tuple_item_assigns);
if props.final_clause { if props.final_clause && !names_to_define.is_empty() {
names_to_define.sort_by(|(id1, _), (id2, _)| id1.cmp(id2));
let names =
names_to_define
.into_iter()
.fold(vec![], |mut names, (index, name)| {
while names.len() < index {
names.push("_".to_string());
}
names.push(name);
names
});
sequence.insert( sequence.insert(
0, 0,
todo!(), // AirTree::tuple_access(names, tipo, check_last_item, tuple), AirTree::tuple_access(
) names,
subject_tipo.clone(),
false,
AirTree::local_var(&props.original_subject_name, subject_tipo.clone()),
),
);
} }
println!("WE GOT SEQUENCE {:#?}", sequence);
(AirTree::void(), AirTree::UnhoistedSequence(sequence)) (AirTree::void(), AirTree::UnhoistedSequence(sequence))
} }
@ -2123,10 +2144,8 @@ impl<'a> CodeGenerator<'a> {
props: &mut ClauseProperties, props: &mut ClauseProperties,
) -> AirTree { ) -> AirTree {
if props.final_clause { if props.final_clause {
print!("FINAL CLAUSE PATTERN IS {:#?}", pattern);
props.complex_clause = false; props.complex_clause = false;
let (_, assign) = self.clause_pattern(pattern, subject_tipo, props); let (_, assign) = self.clause_pattern(pattern, subject_tipo, props);
println!("FINAL CLAUSE ASSIGN IS {:#?}", assign);
assign assign
} else { } else {
assert!( assert!(