Skip to main content

luaur_analysis/methods/
constraint_solver_reproduce_constraints.rs

1use crate::functions::get_type_alt_j::get_type_id;
2use crate::functions::get_type_pack::get_type_pack_id;
3use crate::records::constraint_solver::ConstraintSolver;
4use crate::records::reduce_constraint::ReduceConstraint;
5use crate::records::reduce_pack_constraint::ReducePackConstraint;
6use crate::records::scope::Scope;
7use crate::records::substitution::Substitution;
8use crate::records::type_function_instance_type::TypeFunctionInstanceType;
9use crate::records::type_function_instance_type_pack::TypeFunctionInstanceTypePack;
10use crate::type_aliases::constraint_v::ConstraintV;
11use core::ptr::NonNull;
12use luaur_ast::records::location::Location;
13
14impl ConstraintSolver {
15    pub fn reproduce_constraints(
16        &mut self,
17        scope: NonNull<Scope>,
18        location: Location,
19        subst: &Substitution,
20    ) {
21        for (_, &new_ty) in subst.new_types.iter() {
22            if !unsafe { get_type_id::<TypeFunctionInstanceType>(new_ty) }.is_null() {
23                self.push_constraint(
24                    scope,
25                    location,
26                    ConstraintV::Reduce(ReduceConstraint { ty: new_ty }),
27                );
28            }
29        }
30
31        for (_, &new_pack) in subst.new_packs.iter() {
32            if !unsafe { get_type_pack_id::<TypeFunctionInstanceTypePack>(new_pack) }.is_null() {
33                self.push_constraint(
34                    scope,
35                    location,
36                    ConstraintV::ReducePack(ReducePackConstraint { tp: new_pack }),
37                );
38            }
39        }
40    }
41}