Skip to main content

luaur_analysis/methods/
unifier_2_unify_unifier_2_alt_d.rs

1//! Source: `Analysis/src/Unifier2.cpp:407-438` — `Unifier2::unify_(TypeId, const FunctionType*)`.
2
3use 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}