luaur_analysis/methods/
constraint_solver_unpack_and_assign.rs1use crate::functions::get_mutable_type::get_mutable_type_id;
2use crate::records::blocked_type::BlockedType;
3use crate::records::constraint::Constraint;
4use crate::records::constraint_solver::ConstraintSolver;
5use crate::records::unpack_constraint::UnpackConstraint;
6use crate::type_aliases::constraint_v::ConstraintV;
7use crate::type_aliases::type_id::TypeId;
8use crate::type_aliases::type_pack_id::TypePackId;
9use core::ptr::NonNull;
10use luaur_common::macros::luau_assert::LUAU_ASSERT;
11
12impl ConstraintSolver {
13 pub fn unpack_and_assign(
14 &mut self,
15 dest_types: alloc::vec::Vec<TypeId>,
16 src_types: TypePackId,
17 constraint: NonNull<Constraint>,
18 ) -> NonNull<Constraint> {
19 let c = self.push_constraint(
20 NonNull::new(unsafe { (*constraint.as_ptr()).scope }).unwrap(),
21 unsafe { (*constraint.as_ptr()).location },
22 ConstraintV::Unpack(UnpackConstraint {
23 result_pack: dest_types.clone(),
24 source_pack: src_types,
25 }),
26 );
27
28 for t in dest_types {
29 let bt = unsafe { get_mutable_type_id::<BlockedType>(t) };
30 LUAU_ASSERT!(!bt.is_null());
31 unsafe { (*bt).replace_owner(c.as_ptr()) };
32 }
33
34 c
35 }
36}