Skip to main content

luaur_analysis/methods/
unifier_2_unify_unifier_2_alt_i.rs

1use crate::enums::table_state::TableState;
2use crate::enums::unify_result::UnifyResult;
3use crate::records::property_type::Property;
4use crate::records::table_indexer::TableIndexer;
5use crate::records::table_type::TableType;
6use crate::records::unifier_2::Unifier2;
7use crate::type_aliases::type_id::TypeId;
8
9impl Unifier2 {
10    pub fn unify_table_type_table_type(
11        &mut self,
12        sub_table: &mut TableType,
13        super_table: &TableType,
14    ) -> UnifyResult {
15        let mut result = UnifyResult::Ok;
16
17        for (prop_name, sub_prop) in &sub_table.props {
18            if let Some(super_prop_opt) = super_table.props.get(prop_name) {
19                let super_prop = super_prop_opt;
20
21                if let (Some(sub_read), Some(super_read)) = (sub_prop.read_ty, super_prop.read_ty) {
22                    result &= self.unify_type_id_type_id(sub_read, super_read);
23                }
24
25                if let (Some(sub_write), Some(super_write)) =
26                    (sub_prop.write_ty, super_prop.write_ty)
27                {
28                    result &= self.unify_type_id_type_id(sub_write, super_write);
29                }
30            }
31        }
32
33        let mut sub_type_params_iter = sub_table.instantiated_type_params.iter();
34        let mut super_type_params_iter = super_table.instantiated_type_params.iter();
35
36        while let (Some(sub_tp), Some(super_tp)) =
37            (sub_type_params_iter.next(), super_type_params_iter.next())
38        {
39            result &= self.unify_type_id_type_id(*sub_tp, *super_tp);
40        }
41
42        let mut sub_type_pack_params_iter = sub_table.instantiated_type_pack_params.iter();
43        let mut super_type_pack_params_iter = super_table.instantiated_type_pack_params.iter();
44
45        while let (Some(sub_tpp), Some(super_tpp)) = (
46            sub_type_pack_params_iter.next(),
47            super_type_pack_params_iter.next(),
48        ) {
49            result &= self.unify_type_pack_id_type_pack_id(*sub_tpp, *super_tpp);
50        }
51
52        if let (Some(sub_indexer), Some(super_indexer)) = (&sub_table.indexer, &super_table.indexer)
53        {
54            result &= self.unify_type_id_type_id(sub_indexer.index_type, super_indexer.index_type);
55            result &= self.unify_type_id_type_id(
56                sub_indexer.index_result_type,
57                super_indexer.index_result_type,
58            );
59
60            result &= self.unify_type_id_type_id(super_indexer.index_type, sub_indexer.index_type);
61            result &= self.unify_type_id_type_id(
62                super_indexer.index_result_type,
63                sub_indexer.index_result_type,
64            );
65        }
66
67        if sub_table.indexer.is_none()
68            && sub_table.state == TableState::Unsealed
69            && super_table.indexer.is_some()
70        {
71            let super_indexer = super_table.indexer.as_ref().unwrap();
72
73            let mut index_type = super_indexer.index_type;
74            if let Some(subst) = self.generic_substitutions.find(&index_type) {
75                index_type = *subst;
76            }
77
78            let mut index_result_type = super_indexer.index_result_type;
79            if let Some(subst) = self.generic_substitutions.find(&index_result_type) {
80                index_result_type = *subst;
81            }
82
83            sub_table.indexer = Some(TableIndexer {
84                index_type,
85                index_result_type,
86                is_read_only: false,
87            });
88        }
89
90        result
91    }
92}