Skip to main content

luaur_analysis/methods/
subtyping_unifier_dispatch_constraints.rs

1//! Source: `Analysis/src/SubtypingUnifier.cpp:33-52` — `SubtypingUnifier::dispatchConstraints`.
2
3use crate::enums::unify_result::UnifyResult;
4use crate::records::constraint::Constraint;
5use crate::records::result::Result;
6use crate::records::subtyping_unifier::SubtypingUnifier;
7use crate::type_aliases::constraint_v::ConstraintV;
8use crate::type_aliases::upper_bounds::UpperBounds;
9use alloc::vec::Vec;
10
11impl SubtypingUnifier {
12    pub fn dispatch_constraints(
13        &self,
14        constraint: *const Constraint,
15        assumed_constraints: Vec<ConstraintV>,
16    ) -> Result {
17        let mut unifier_res = UnifyResult::Ok;
18        // NOTE: You *could* potentially reuse the input vector, but this seems
19        // easier to read.
20        let mut outstanding_constraints: Vec<ConstraintV> = Vec::new();
21        outstanding_constraints.reserve(assumed_constraints.len());
22        let mut upper_bounds: UpperBounds = UpperBounds::new(core::ptr::null());
23        for cv in assumed_constraints {
24            let (unified, dispatched) =
25                self.dispatch_one_constraint(constraint, &cv, &mut upper_bounds);
26            unifier_res &= unified;
27            if !dispatched {
28                outstanding_constraints.push(cv);
29            }
30        }
31        Result {
32            unified: unifier_res,
33            outstanding_constraints,
34            upper_bound_contributors: upper_bounds,
35        }
36    }
37}