luaur_analysis/methods/
magic_require_infer.rs1use crate::functions::as_mutable_type_pack_alt_d::as_mutable_type_pack;
2use crate::functions::check_require_path_dcr::check_require_path_dcr;
3use crate::records::generic_error::GenericError;
4use crate::records::magic_function_call_context::MagicFunctionCallContext;
5use crate::records::type_pack::TypePack;
6use crate::type_aliases::type_error_data::TypeErrorData;
7use crate::type_aliases::type_pack_variant::TypePackVariant;
8use alloc::vec;
9
10pub fn magic_require_infer(context: &MagicFunctionCallContext) -> bool {
11 let call_site = unsafe { context.call_site.as_ref() };
12 let solver = unsafe { &mut *context.solver.as_ptr() };
13
14 if call_site.args.size != 1 {
15 solver.report_error_type_error_data_location(
16 TypeErrorData::GenericError(GenericError::new("require takes 1 argument".to_string())),
17 &call_site.base.base.location,
18 );
19 return false;
20 }
21
22 let arg = unsafe { *call_site.args.data.add(0) };
23 if !check_require_path_dcr(context.solver, arg) {
24 return false;
25 }
26
27 let module = match solver.module.as_ref() {
28 Some(module) => module.clone(),
29 None => return false,
30 };
31
32 let module_info = unsafe {
33 ((*solver.module_resolver).vtable.resolve_module_info)(
34 solver.module_resolver,
35 &module.name,
36 context.call_site.as_ptr() as *const luaur_ast::records::ast_expr::AstExpr,
37 )
38 };
39
40 if let Some(module_info) = module_info {
41 let module_type = solver.resolve_module(&module_info, &call_site.base.base.location);
42 let module_result = unsafe {
43 (*solver.arena).add_type_pack_t(TypePack {
44 head: vec![module_type],
45 tail: None,
46 })
47 };
48 let result_tp = as_mutable_type_pack(context.result);
49 unsafe {
50 (*result_tp).ty = TypePackVariant::Bound(module_result);
51 }
52
53 return true;
54 }
55
56 false
57}