luaur_analysis/functions/
dump_constraint_solver.rs1use 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}