fix: tuples and list patterns had a few issues
This commit is contained in:
parent
960a15c4ec
commit
2f4319f162
|
@ -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!(
|
||||||
|
|
Loading…
Reference in New Issue