Skip to main content

luaur_analysis/methods/
normalizer_union_saturated_functions.rs

1use crate::functions::get_type_alt_j::get_type_id;
2use crate::records::function_type::FunctionType;
3use crate::records::normalizer::Normalizer;
4use crate::type_aliases::type_id::TypeId;
5use crate::type_aliases::type_pack_id::TypePackId;
6
7impl Normalizer {
8    pub fn union_saturated_functions(&mut self, here: TypeId, there: TypeId) -> Option<TypeId> {
9        self.consume_fuel();
10
11        let hftv = unsafe { get_type_id::<FunctionType>(here) };
12        if hftv.is_null() {
13            return None;
14        }
15
16        let tftv = unsafe { get_type_id::<FunctionType>(there) };
17        if tftv.is_null() {
18            return None;
19        }
20
21        let hftv_ref = unsafe { &*hftv };
22        let tftv_ref = unsafe { &*tftv };
23
24        if hftv_ref.generics != tftv_ref.generics {
25            return None;
26        }
27
28        if hftv_ref.generic_packs != tftv_ref.generic_packs {
29            return None;
30        }
31
32        let arg_types = self.union_of_type_packs(hftv_ref.arg_types, tftv_ref.arg_types)?;
33        let ret_types = self.union_of_type_packs(hftv_ref.ret_types, tftv_ref.ret_types)?;
34
35        let mut result = FunctionType::function_type_new(arg_types, ret_types, None, false);
36        result.generics = hftv_ref.generics.clone();
37        result.generic_packs = hftv_ref.generic_packs.clone();
38
39        Some(unsafe { (*self.arena).add_type(result) })
40    }
41}