Skip to main content

luaur_analysis/methods/
magic_require_infer.rs

1use 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}