Skip to main content

luaur_analysis/functions/
dump_constraint_solver.rs

1//! `static void dump(ConstraintSolver* cs, ToStringOptions& opts)`
2//! (`Analysis/src/ConstraintSolver.cpp:4315-4335`, hand-ported faithfully).
3
4use core::ptr::NonNull;
5
6use crate::functions::to_string_to_string_alt_q::to_string_constraint_to_string_options;
7use crate::records::constraint::Constraint;
8use crate::records::constraint_solver::ConstraintSolver;
9use crate::records::to_string_options::ToStringOptions;
10use luaur_common::FFlag;
11
12pub fn dump(cs: *mut ConstraintSolver, opts: &mut ToStringOptions) {
13    let cs_ref = unsafe { &mut *cs };
14
15    if FFlag::LuauConstraintGraph.get() {
16        let unsolved: alloc::vec::Vec<NonNull<Constraint>> = cs_ref
17            .unsolved_constraints
18            .iter()
19            .map(|c| NonNull::new(*c as *mut Constraint).unwrap())
20            .collect();
21        unsafe { (*cs_ref.cgraph).dump_with(&unsolved, opts) };
22    } else {
23        for c in cs_ref.unsolved_constraints.iter() {
24            let c = *c;
25            let block_count = cs_ref
26                .deprecated_blocked_constraints
27                .get(&c)
28                .map(|v| *v as i32)
29                .unwrap_or(0);
30            std::print!(
31                "\t{}\t{}\n",
32                block_count,
33                to_string_constraint_to_string_options(unsafe { &*c }, opts)
34            );
35            for dep in unsafe { &(*c).deprecated_dependencies } {
36                let dep_const = *dep as *const Constraint;
37                if cs_ref
38                    .unsolved_constraints
39                    .iter()
40                    .any(|uc| *uc == dep_const)
41                {
42                    std::print!(
43                        "\t\t|\t{}\n",
44                        to_string_constraint_to_string_options(unsafe { &*dep_const }, opts)
45                    );
46                }
47            }
48        }
49    }
50}