fix issue with final clause producing clauseguard air
This commit is contained in:
parent
e9883adf12
commit
4c838defd1
|
@ -67,6 +67,7 @@ pub enum ClauseProperties {
|
||||||
needs_constr_var: bool,
|
needs_constr_var: bool,
|
||||||
is_complex_clause: bool,
|
is_complex_clause: bool,
|
||||||
original_subject_name: String,
|
original_subject_name: String,
|
||||||
|
final_clause: bool,
|
||||||
},
|
},
|
||||||
ListClause {
|
ListClause {
|
||||||
clause_var_name: String,
|
clause_var_name: String,
|
||||||
|
@ -74,6 +75,7 @@ pub enum ClauseProperties {
|
||||||
is_complex_clause: bool,
|
is_complex_clause: bool,
|
||||||
original_subject_name: String,
|
original_subject_name: String,
|
||||||
current_index: i64,
|
current_index: i64,
|
||||||
|
final_clause: bool,
|
||||||
},
|
},
|
||||||
TupleClause {
|
TupleClause {
|
||||||
clause_var_name: String,
|
clause_var_name: String,
|
||||||
|
@ -81,6 +83,7 @@ pub enum ClauseProperties {
|
||||||
is_complex_clause: bool,
|
is_complex_clause: bool,
|
||||||
original_subject_name: String,
|
original_subject_name: String,
|
||||||
defined_tuple_indices: IndexSet<(usize, String)>,
|
defined_tuple_indices: IndexSet<(usize, String)>,
|
||||||
|
final_clause: bool,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,6 +96,7 @@ impl ClauseProperties {
|
||||||
is_complex_clause: false,
|
is_complex_clause: false,
|
||||||
original_subject_name: subject_name,
|
original_subject_name: subject_name,
|
||||||
current_index: -1,
|
current_index: -1,
|
||||||
|
final_clause: false,
|
||||||
}
|
}
|
||||||
} else if t.is_tuple() {
|
} else if t.is_tuple() {
|
||||||
ClauseProperties::TupleClause {
|
ClauseProperties::TupleClause {
|
||||||
|
@ -101,6 +105,7 @@ impl ClauseProperties {
|
||||||
is_complex_clause: false,
|
is_complex_clause: false,
|
||||||
original_subject_name: subject_name,
|
original_subject_name: subject_name,
|
||||||
defined_tuple_indices: IndexSet::new(),
|
defined_tuple_indices: IndexSet::new(),
|
||||||
|
final_clause: false,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ClauseProperties::ConstrClause {
|
ClauseProperties::ConstrClause {
|
||||||
|
@ -108,6 +113,7 @@ impl ClauseProperties {
|
||||||
needs_constr_var: false,
|
needs_constr_var: false,
|
||||||
is_complex_clause: false,
|
is_complex_clause: false,
|
||||||
original_subject_name: subject_name,
|
original_subject_name: subject_name,
|
||||||
|
final_clause: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,6 +145,14 @@ impl ClauseProperties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_final_clause(&mut self) -> &mut bool {
|
||||||
|
match self {
|
||||||
|
ClauseProperties::ConstrClause { final_clause, .. }
|
||||||
|
| ClauseProperties::ListClause { final_clause, .. }
|
||||||
|
| ClauseProperties::TupleClause { final_clause, .. } => final_clause,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn clause_var_name(&mut self) -> &mut String {
|
pub fn clause_var_name(&mut self) -> &mut String {
|
||||||
match self {
|
match self {
|
||||||
ClauseProperties::ConstrClause {
|
ClauseProperties::ConstrClause {
|
||||||
|
|
|
@ -401,9 +401,11 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
final_scope.push(self.id_gen.next());
|
final_scope.push(self.id_gen.next());
|
||||||
|
|
||||||
|
if !matches!(clause_properties, ClauseProperties::TupleClause { .. }) {
|
||||||
pattern_vec.push(Air::Finally {
|
pattern_vec.push(Air::Finally {
|
||||||
scope: final_scope.clone(),
|
scope: final_scope.clone(),
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
let mut final_clause_vec = vec![];
|
let mut final_clause_vec = vec![];
|
||||||
|
|
||||||
|
@ -413,6 +415,8 @@ impl<'a> CodeGenerator<'a> {
|
||||||
final_scope.clone(),
|
final_scope.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
*clause_properties.is_final_clause() = true;
|
||||||
|
|
||||||
self.when_ir(
|
self.when_ir(
|
||||||
last_pattern,
|
last_pattern,
|
||||||
&mut pattern_vec,
|
&mut pattern_vec,
|
||||||
|
@ -1079,6 +1083,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
&mut nested_pattern,
|
&mut nested_pattern,
|
||||||
items_type,
|
items_type,
|
||||||
scope.clone(),
|
scope.clone(),
|
||||||
|
*clause_properties.is_final_clause(),
|
||||||
);
|
);
|
||||||
|
|
||||||
names.push(name.unwrap_or_else(|| "_".to_string()))
|
names.push(name.unwrap_or_else(|| "_".to_string()))
|
||||||
|
@ -1190,6 +1195,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
.into(),
|
.into(),
|
||||||
),
|
),
|
||||||
scope.clone(),
|
scope.clone(),
|
||||||
|
*clause_properties.is_final_clause(),
|
||||||
);
|
);
|
||||||
|
|
||||||
var_name.map_or(
|
var_name.map_or(
|
||||||
|
@ -1233,6 +1239,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
&mut nested_pattern,
|
&mut nested_pattern,
|
||||||
type_map.get(&index).unwrap(),
|
type_map.get(&index).unwrap(),
|
||||||
scope.clone(),
|
scope.clone(),
|
||||||
|
*clause_properties.is_final_clause(),
|
||||||
);
|
);
|
||||||
|
|
||||||
var_name.map_or(Some(("_".to_string(), index)), |var_name| {
|
var_name.map_or(Some(("_".to_string(), index)), |var_name| {
|
||||||
|
@ -1271,6 +1278,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
&mut nested_pattern,
|
&mut nested_pattern,
|
||||||
&items_type[index],
|
&items_type[index],
|
||||||
scope.clone(),
|
scope.clone(),
|
||||||
|
*clause_properties.is_final_clause(),
|
||||||
);
|
);
|
||||||
|
|
||||||
names.push((name.unwrap_or_else(|| "_".to_string()), index))
|
names.push((name.unwrap_or_else(|| "_".to_string()), index))
|
||||||
|
@ -1343,6 +1351,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
pattern_vec: &mut Vec<Air>,
|
pattern_vec: &mut Vec<Air>,
|
||||||
pattern_type: &Arc<Type>,
|
pattern_type: &Arc<Type>,
|
||||||
scope: Vec<u64>,
|
scope: Vec<u64>,
|
||||||
|
final_clause: bool,
|
||||||
) -> Option<String> {
|
) -> Option<String> {
|
||||||
match pattern {
|
match pattern {
|
||||||
Pattern::Var { name, .. } => Some(name.clone()),
|
Pattern::Var { name, .. } => Some(name.clone()),
|
||||||
|
@ -1375,6 +1384,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
is_complex_clause: false,
|
is_complex_clause: false,
|
||||||
original_subject_name: item_name.clone(),
|
original_subject_name: item_name.clone(),
|
||||||
current_index: index as i64,
|
current_index: index as i64,
|
||||||
|
final_clause
|
||||||
};
|
};
|
||||||
|
|
||||||
let tail_name = format!("{new_tail_name}_{index}");
|
let tail_name = format!("{new_tail_name}_{index}");
|
||||||
|
@ -1466,18 +1476,23 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let data_type = lookup_data_type_by_tipo(self.data_types.clone(), tipo).unwrap();
|
let data_type = lookup_data_type_by_tipo(self.data_types.clone(), tipo).unwrap();
|
||||||
|
|
||||||
if data_type.constructors.len() > 1 {
|
if data_type.constructors.len() > 1 {
|
||||||
|
if final_clause{
|
||||||
|
pattern_vec.push(Air::Finally { scope: scope.clone() });
|
||||||
|
} else {
|
||||||
pattern_vec.push(Air::ClauseGuard {
|
pattern_vec.push(Air::ClauseGuard {
|
||||||
scope: scope.clone(),
|
scope: scope.clone(),
|
||||||
tipo: tipo.clone(),
|
tipo: tipo.clone(),
|
||||||
subject_name: constr_var_name.clone(),
|
subject_name: constr_var_name.clone(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut clause_properties = ClauseProperties::ConstrClause {
|
let mut clause_properties = ClauseProperties::ConstrClause {
|
||||||
clause_var_name: constr_var_name.clone(),
|
clause_var_name: constr_var_name.clone(),
|
||||||
needs_constr_var: false,
|
needs_constr_var: false,
|
||||||
is_complex_clause: false,
|
is_complex_clause: false,
|
||||||
original_subject_name: constr_var_name.clone(),
|
original_subject_name: constr_var_name.clone(),
|
||||||
|
final_clause
|
||||||
};
|
};
|
||||||
|
|
||||||
self.when_ir(
|
self.when_ir(
|
||||||
|
@ -1500,6 +1515,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
is_complex_clause: false,
|
is_complex_clause: false,
|
||||||
original_subject_name: item_name.clone(),
|
original_subject_name: item_name.clone(),
|
||||||
defined_tuple_indices: IndexSet::new(),
|
defined_tuple_indices: IndexSet::new(),
|
||||||
|
final_clause
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut inner_pattern_vec = vec![];
|
let mut inner_pattern_vec = vec![];
|
||||||
|
|
Loading…
Reference in New Issue