fix issue with constructor clauses and clause props
This commit is contained in:
parent
c4c0ace3a6
commit
cce76bbd63
|
@ -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:#?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue