fix issue with constructor clauses and clause props

This commit is contained in:
Kasey White 2022-12-28 16:06:25 -05:00 committed by Lucas
parent c4c0ace3a6
commit cce76bbd63
2 changed files with 49 additions and 10 deletions

View File

@ -748,15 +748,42 @@ pub fn check_when_pattern_needs(
Pattern::Var { .. } => { Pattern::Var { .. } => {
*clause_properties.needs_constr_var() = true; *clause_properties.needs_constr_var() = true;
} }
Pattern::List { .. } Pattern::List { elements, tail, .. } => {
| Pattern::Constructor { .. }
| Pattern::Tuple { .. }
| Pattern::Int { .. } => {
*clause_properties.needs_constr_var() = true; *clause_properties.needs_constr_var() = true;
*clause_properties.is_complex_clause() = true;
for element in elements {
check_when_pattern_needs(element, clause_properties);
}
if let Some(tail) = tail {
check_when_pattern_needs(tail, clause_properties);
}
}
Pattern::Tuple { elems, .. } => {
*clause_properties.needs_constr_var() = true;
*clause_properties.is_complex_clause() = true;
for element in elems {
check_when_pattern_needs(element, clause_properties);
}
}
Pattern::Int { .. } => {
*clause_properties.needs_constr_var() = true;
*clause_properties.is_complex_clause() = true; *clause_properties.is_complex_clause() = true;
} }
Pattern::Discard { .. } => {} Pattern::Constructor { arguments, .. } => {
*clause_properties.needs_constr_var() = true;
*clause_properties.is_complex_clause() = true;
for argument in arguments {
check_when_pattern_needs(&argument.value, clause_properties);
}
}
Pattern::Discard { .. } => {}
_ => todo!("{pattern:#?}"), _ => todo!("{pattern:#?}"),
} }
} }

View File

@ -320,7 +320,9 @@ impl<'a> CodeGenerator<'a> {
let last_pattern = &last_clause.pattern[0]; let last_pattern = &last_clause.pattern[0];
let mut final_scope = scope.clone(); let mut final_scope = scope.clone();
final_scope.push(self.id_gen.next()); final_scope.push(self.id_gen.next());
pattern_vec.push(Air::Finally { pattern_vec.push(Air::Finally {
scope: final_scope.clone(), scope: final_scope.clone(),
}); });
@ -785,8 +787,11 @@ impl<'a> CodeGenerator<'a> {
name: constr_name, name: constr_name,
.. ..
} => { } => {
let mut temp_clause_properties = clause_properties.clone();
*temp_clause_properties.needs_constr_var() = false;
for arg in arguments { for arg in arguments {
check_when_pattern_needs(&arg.value, clause_properties); check_when_pattern_needs(&arg.value, &mut temp_clause_properties);
} }
// find data type definition // find data type definition
@ -821,7 +826,7 @@ impl<'a> CodeGenerator<'a> {
location: Span::empty(), location: Span::empty(),
}, },
), ),
name: clause_properties.clause_var_name().clone(), name: temp_clause_properties.clause_var_name().clone(),
scope: scope.clone(), scope: scope.clone(),
variant_name: String::new(), variant_name: String::new(),
}]; }];
@ -835,7 +840,7 @@ impl<'a> CodeGenerator<'a> {
}); });
} }
if *clause_properties.needs_constr_var() { if *temp_clause_properties.needs_constr_var() {
self.when_recursive_ir( self.when_recursive_ir(
pattern, pattern,
pattern_vec, pattern_vec,
@ -844,7 +849,6 @@ impl<'a> CodeGenerator<'a> {
tipo, tipo,
scope, scope,
); );
pattern_vec.append(values);
} else { } else {
self.when_recursive_ir( self.when_recursive_ir(
pattern, pattern,
@ -854,8 +858,16 @@ impl<'a> CodeGenerator<'a> {
tipo, tipo,
scope, scope,
); );
pattern_vec.append(values);
} }
pattern_vec.append(values);
// unify clause properties
*clause_properties.is_complex_clause() = *clause_properties.is_complex_clause()
|| *temp_clause_properties.is_complex_clause();
*clause_properties.needs_constr_var() = *clause_properties.needs_constr_var()
|| *temp_clause_properties.needs_constr_var();
} }
Pattern::Tuple { elems, .. } => { Pattern::Tuple { elems, .. } => {
for elem in elems { for elem in elems {