Skip to main content

luaur_analysis/methods/
normalizer_is_inhabited_normalize_alt_b.rs

1use crate::enums::normalization_result::NormalizationResult;
2use crate::functions::get_type_alt_j::get_type_id;
3use crate::records::never_type::NeverType;
4use crate::records::normalized_type::NormalizedType;
5use crate::records::normalizer::Normalizer;
6use crate::type_aliases::type_id::TypeId;
7use luaur_common::records::dense_hash_set::DenseHashSet;
8use luaur_common::FFlag;
9
10impl Normalizer {
11    pub fn is_inhabited_normalized_type_set_type_id(
12        &mut self,
13        norm: &NormalizedType,
14        seen: &mut DenseHashSet<TypeId>,
15    ) -> NormalizationResult {
16        if FFlag::LuauIntegerType2.get() {
17            if unsafe { get_type_id::<NeverType>(norm.tops).is_null() }
18                || unsafe { get_type_id::<NeverType>(norm.booleans).is_null() }
19                || unsafe { get_type_id::<NeverType>(norm.errors).is_null() }
20                || unsafe { get_type_id::<NeverType>(norm.nils).is_null() }
21                || unsafe { get_type_id::<NeverType>(norm.numbers).is_null() }
22                || unsafe { get_type_id::<NeverType>(norm.threads).is_null() }
23                || unsafe { get_type_id::<NeverType>(norm.buffers).is_null() }
24                || !norm.extern_types.is_never()
25                || unsafe { get_type_id::<NeverType>(norm.integers).is_null() }
26                || !norm.strings.is_never()
27                || !norm.functions.is_never()
28            {
29                return NormalizationResult::True;
30            }
31        } else {
32            if unsafe { get_type_id::<NeverType>(norm.tops).is_null() }
33                || unsafe { get_type_id::<NeverType>(norm.booleans).is_null() }
34                || unsafe { get_type_id::<NeverType>(norm.errors).is_null() }
35                || unsafe { get_type_id::<NeverType>(norm.nils).is_null() }
36                || unsafe { get_type_id::<NeverType>(norm.numbers).is_null() }
37                || unsafe { get_type_id::<NeverType>(norm.threads).is_null() }
38                || unsafe { get_type_id::<NeverType>(norm.buffers).is_null() }
39                || !norm.extern_types.is_never()
40                || !norm.strings.is_never()
41                || !norm.functions.is_never()
42            {
43                return NormalizationResult::True;
44            }
45        }
46
47        for (_, intersect) in &norm.tyvars {
48            let res = self.is_inhabited_normalized_type_set_type_id(intersect, seen);
49            if res != NormalizationResult::False {
50                return res;
51            }
52        }
53
54        for &table in &norm.tables.order {
55            let res = self.is_inhabited_type_id_set_type_id(table, seen);
56            if res != NormalizationResult::False {
57                return res;
58            }
59        }
60
61        NormalizationResult::False
62    }
63}