forked from M-Labs/nac3
nac3core: maintain order of unifying dummy types in top level
This commit is contained in:
parent
0fe346106d
commit
87b71a2db3
|
@ -1,4 +1,4 @@
|
|||
use std::cell::RefCell;
|
||||
use std::{cell::RefCell, collections::LinkedList};
|
||||
|
||||
use nac3parser::ast::fold::Fold;
|
||||
use inkwell::{FloatPredicate, IntPredicate};
|
||||
|
@ -946,6 +946,7 @@ impl TopLevelComposer {
|
|||
let unifier = self.unifier.borrow_mut();
|
||||
|
||||
let mut type_var_to_concrete_def: HashMap<Type, TypeAnnotation> = HashMap::new();
|
||||
let mut ordered_type_vars: LinkedList<Type> = LinkedList::new();
|
||||
|
||||
// skip 5 to skip analyzing the primitives
|
||||
for (class_def, class_ast) in def_ast_list.iter().skip(self.built_in_num) {
|
||||
|
@ -956,14 +957,12 @@ impl TopLevelComposer {
|
|||
&temp_def_list,
|
||||
unifier,
|
||||
primitives,
|
||||
&mut type_var_to_concrete_def,
|
||||
(&mut type_var_to_concrete_def, &mut ordered_type_vars),
|
||||
&self.keyword_list,
|
||||
)?
|
||||
}
|
||||
}
|
||||
|
||||
// println!("type_var_to_concrete_def1: {:?}", type_var_to_concrete_def);
|
||||
|
||||
// handle the inheritanced methods and fields
|
||||
let mut current_ancestor_depth: usize = 2;
|
||||
loop {
|
||||
|
@ -998,21 +997,15 @@ impl TopLevelComposer {
|
|||
}
|
||||
}
|
||||
|
||||
// println!("type_var_to_concrete_def3: {:?}\n", type_var_to_concrete_def);
|
||||
|
||||
// unification of previously assigned typevar
|
||||
for (ty, def) in type_var_to_concrete_def {
|
||||
// println!(
|
||||
// "{:?}_{} -> {:?}\n",
|
||||
// ty,
|
||||
// unifier.stringify(ty,
|
||||
// &mut |id| format!("class{}", id),
|
||||
// &mut |id| format!("tvar{}", id)
|
||||
// ),
|
||||
// def
|
||||
// );
|
||||
for ty in ordered_type_vars {
|
||||
let target_ty =
|
||||
get_type_from_type_annotation_kinds(&temp_def_list, unifier, primitives, &def)?;
|
||||
get_type_from_type_annotation_kinds(
|
||||
&temp_def_list,
|
||||
unifier,
|
||||
primitives,
|
||||
type_var_to_concrete_def.get(&ty).unwrap()
|
||||
)?;
|
||||
unifier.unify(ty, target_ty)?;
|
||||
}
|
||||
|
||||
|
@ -1229,9 +1222,11 @@ impl TopLevelComposer {
|
|||
temp_def_list: &[Arc<RwLock<TopLevelDef>>],
|
||||
unifier: &mut Unifier,
|
||||
primitives: &PrimitiveStore,
|
||||
type_var_to_concrete_def: &mut HashMap<Type, TypeAnnotation>,
|
||||
type_var_to_concrete_def: (&mut HashMap<Type, TypeAnnotation>, &mut LinkedList<Type>),
|
||||
// ordered_type_vars: &mut LinkedList<Type>,
|
||||
keyword_list: &HashSet<StrRef>,
|
||||
) -> Result<(), String> {
|
||||
let (type_var_to_concrete_def, ordered_type_vars) = type_var_to_concrete_def;
|
||||
let mut class_def = class_def.write();
|
||||
let (
|
||||
class_id,
|
||||
|
@ -1381,6 +1376,7 @@ impl TopLevelComposer {
|
|||
// into the list for later unification
|
||||
type_var_to_concrete_def
|
||||
.insert(dummy_func_arg.ty, type_ann.clone());
|
||||
ordered_type_vars.push_back(dummy_func_arg.ty);
|
||||
result.push(dummy_func_arg)
|
||||
}
|
||||
}
|
||||
|
@ -1415,6 +1411,7 @@ impl TopLevelComposer {
|
|||
}
|
||||
let dummy_return_type = unifier.get_fresh_var().0;
|
||||
type_var_to_concrete_def.insert(dummy_return_type, annotation.clone());
|
||||
ordered_type_vars.push_back(dummy_return_type);
|
||||
dummy_return_type
|
||||
} else {
|
||||
// if do not have return annotation, return none
|
||||
|
@ -1424,6 +1421,7 @@ impl TopLevelComposer {
|
|||
dummy_return_type,
|
||||
TypeAnnotation::Primitive(primitives.none),
|
||||
);
|
||||
ordered_type_vars.push_back(dummy_return_type);
|
||||
dummy_return_type
|
||||
}
|
||||
};
|
||||
|
@ -1502,6 +1500,7 @@ impl TopLevelComposer {
|
|||
}
|
||||
}
|
||||
type_var_to_concrete_def.insert(dummy_field_type, annotation);
|
||||
ordered_type_vars.push_back(dummy_field_type);
|
||||
} else {
|
||||
return Err("same class fields defined twice".into());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue