Skip to main content

luaur_analysis/methods/
constraint_solver_unpack_and_assign.rs

1use 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}