luaur_analysis/methods/
unifier_2_unify_unifier_2_alt_i.rs1use 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}