luaur_analysis/methods/
magic_assert_handle_old_solver.rs1use crate::functions::first::first;
2use crate::functions::flatten_type_pack::flatten_type_pack_id;
3use crate::functions::get_type_alt_j::get_type_id;
4use crate::records::never_type::NeverType;
5use crate::records::type_checker::TypeChecker;
6use crate::records::type_pack::TypePack;
7use crate::records::with_predicate::WithPredicate;
8use crate::type_aliases::scope_ptr_type_infer::ScopePtr;
9use crate::type_aliases::type_pack_id::TypePackId;
10use alloc::sync::Arc;
11use luaur_ast::records::ast_expr_call::AstExprCall;
12
13pub fn magic_assert_handle_old_solver(
14 typechecker: &mut TypeChecker,
15 scope: &ScopePtr,
16 _expr: &AstExprCall,
17 with_predicate: WithPredicate<TypePackId>,
18) -> Option<WithPredicate<TypePackId>> {
19 let param_pack = with_predicate.r#type;
20 let predicates = with_predicate.predicates;
21 let module = typechecker.current_module.as_ref()?;
22 let arena = unsafe {
23 &mut (*(Arc::as_ptr(module) as *mut crate::records::module::Module)).internal_types
24 };
25
26 let (mut head, tail) = flatten_type_pack_id(param_pack);
27 if head.is_empty() && tail.is_some() {
28 let fst = first(tail.unwrap(), false);
29 if let Some(fst) = fst {
30 head.push(fst);
31 } else {
32 return Some(WithPredicate::with_predicate_t_predicate_vec(
33 param_pack, predicates,
34 ));
35 }
36 }
37
38 typechecker.resolve_predicate_vec_scope_ptr_bool(&predicates, scope, true);
39
40 if !head.is_empty() {
41 let (ty, _ok) = typechecker.pick_types_from_sense(head[0], true, unsafe {
42 (*typechecker.builtin_types).nilType
43 });
44
45 if let Some(ty) = ty {
46 if unsafe { !get_type_id::<NeverType>(ty).is_null() } {
47 head = vec![ty];
48 } else {
49 head[0] = ty;
50 }
51 }
52 }
53
54 let new_tp_id = arena.add_type_pack_t(TypePack { head, tail });
55 Some(WithPredicate::with_predicate_t_predicate_vec(
56 new_tp_id, predicates,
57 ))
58}