luaur_analysis/methods/
unifier_2_unify_unifier_2_alt_d.rs1use crate::enums::unify_result::UnifyResult;
4use crate::functions::follow_type::follow_type_id;
5use crate::functions::follow_type_pack::follow_type_pack_id;
6use crate::functions::get_type_alt_j::get_type_id;
7use crate::functions::get_type_pack::get_type_pack_id;
8use crate::records::function_type::FunctionType;
9use crate::records::generic_type::GenericType;
10use crate::records::generic_type_pack::GenericTypePack;
11use crate::records::unifier_2::Unifier2;
12use crate::type_aliases::type_id::TypeId;
13
14impl Unifier2 {
15 pub fn unify_type_id_function_type(
16 &mut self,
17 sub_ty: TypeId,
18 super_fn: &FunctionType,
19 ) -> UnifyResult {
20 let sub_fn = unsafe { get_type_id::<FunctionType>(sub_ty) };
21 let sub_fn = unsafe { &*sub_fn };
22
23 let should_instantiate = (super_fn.generics.is_empty() && !sub_fn.generics.is_empty())
24 || (super_fn.generic_packs.is_empty() && !sub_fn.generic_packs.is_empty());
25
26 if should_instantiate {
27 for &generic in sub_fn.generics.iter() {
28 let generic = unsafe { follow_type_id(generic) };
29 let gen = unsafe { get_type_id::<GenericType>(generic) };
30 if !gen.is_null() {
31 let polarity = unsafe { (*gen).polarity };
32 let fresh = self.fresh_type(self.scope, polarity);
33 *self.generic_substitutions.get_or_insert(generic) = fresh;
34 }
35 }
36
37 for &generic_pack in sub_fn.generic_packs.iter() {
38 let generic_pack = unsafe { follow_type_pack_id(generic_pack) };
39 let gen = unsafe { get_type_pack_id::<GenericTypePack>(generic_pack) };
40 if !gen.is_null() {
41 let polarity = unsafe { (*gen).polarity };
42 let fresh = self.fresh_type_pack(self.scope, polarity);
43 *self.generic_pack_substitutions.get_or_insert(generic_pack) = fresh;
44 }
45 }
46 }
47
48 let arg_result = self.unify_type_pack_id_type_pack_id(super_fn.arg_types, sub_fn.arg_types);
49 let ret_result = self.unify_type_pack_id_type_pack_id(sub_fn.ret_types, super_fn.ret_types);
50 arg_result & ret_result
51 }
52}