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