Skip to main content

luaur_analysis/methods/
normalizer_intersection_of_bools.rs

1use crate::functions::get_type_alt_j::get_type_id;
2use crate::records::boolean_singleton::BooleanSingleton;
3use crate::records::never_type::NeverType;
4use crate::records::normalizer::Normalizer;
5use crate::records::singleton_type::SingletonType;
6use crate::type_aliases::type_id::TypeId;
7
8impl Normalizer {
9    pub fn intersection_of_bools(&mut self, here: TypeId, there: TypeId) -> TypeId {
10        self.consume_fuel();
11
12        if !unsafe { get_type_id::<NeverType>(here).is_null() } {
13            return here;
14        }
15        if !unsafe { get_type_id::<NeverType>(there).is_null() } {
16            return there;
17        }
18
19        if let Some(hbool) = unsafe {
20            get_type_id::<SingletonType>(here)
21                .as_ref()
22                .and_then(|s| s.variant.get_if::<BooleanSingleton>())
23        } {
24            if let Some(tbool) = unsafe {
25                get_type_id::<SingletonType>(there)
26                    .as_ref()
27                    .and_then(|s| s.variant.get_if::<BooleanSingleton>())
28            } {
29                if hbool.value == tbool.value {
30                    return here;
31                } else {
32                    return unsafe { (*self.builtin_types).neverType };
33                }
34            }
35
36            return here;
37        }
38
39        there
40    }
41}