Skip to main content

luaur_analysis/methods/
constraint_solver_inherit_blocks.rs

1use crate::records::constraint::Constraint;
2use crate::records::constraint_graph::ConstraintGraph;
3use crate::records::constraint_solver::ConstraintSolver;
4use crate::type_aliases::blocked_constraint_id::BlockedConstraintId;
5use crate::FFlag;
6use luaur_common::records::dense_hash_set::DenseHashSet;
7
8impl ConstraintSolver {
9    pub fn inherit_blocks(&mut self, source: *const Constraint, addition: *const Constraint) {
10        if FFlag::LuauConstraintGraph.get() {
11            unsafe {
12                (*self.cgraph).inherit_blocks(
13                    crate::type_aliases::constraint_vertex::ConstraintVertex::V2(source),
14                    crate::type_aliases::constraint_vertex::ConstraintVertex::V2(addition),
15                )
16            }
17        } else {
18            // Anything that is blocked on this constraint must also be blocked on our
19            // synthesized constraints.
20            let blocked_constraints: alloc::vec::Vec<*const Constraint> = match self
21                .deprecated_blocked
22                .get(&BlockedConstraintId::V2(source))
23            {
24                Some(blocked_set) => blocked_set.iter().copied().collect(),
25                None => alloc::vec::Vec::new(),
26            };
27            for blocked_constraint in blocked_constraints {
28                self.block_not_null_constraint_not_null_constraint(addition, blocked_constraint);
29            }
30        }
31    }
32}