Skip to main content

luaur_analysis/methods/
magic_require_handle_old_solver.rs

1use crate::functions::check_require_path::check_require_path;
2use crate::records::generic_error::GenericError;
3use crate::records::type_checker::TypeChecker;
4use crate::records::type_pack::TypePack;
5use crate::records::with_predicate::WithPredicate;
6use crate::type_aliases::scope_ptr_type_infer::ScopePtr;
7use crate::type_aliases::type_error_data::TypeErrorData;
8use crate::type_aliases::type_pack_id::TypePackId;
9use alloc::sync::Arc;
10use alloc::vec;
11use luaur_ast::records::ast_expr_call::AstExprCall;
12
13pub fn magic_require_handle_old_solver(
14    typechecker: &mut TypeChecker,
15    scope: &ScopePtr,
16    expr: &AstExprCall,
17    _with_predicate: WithPredicate<TypePackId>,
18) -> Option<WithPredicate<TypePackId>> {
19    let module = typechecker.current_module.as_ref()?.clone();
20    let arena = unsafe {
21        &mut (*(Arc::as_ptr(&module) as *mut crate::records::module::Module)).internal_types
22    };
23
24    if expr.args.size != 1 {
25        typechecker.report_error_location_type_error_data(
26            &expr.base.base.location,
27            TypeErrorData::GenericError(GenericError::new("require takes 1 argument".to_string())),
28        );
29        return None;
30    }
31
32    let arg = unsafe { *expr.args.data.add(0) };
33    if !check_require_path(typechecker, arg) {
34        return None;
35    }
36
37    let module_info = unsafe {
38        ((*typechecker.resolver).vtable.resolve_module_info)(
39            typechecker.resolver,
40            &module.name,
41            arg,
42        )
43    };
44
45    if let Some(module_info) = module_info {
46        let require_type = typechecker.check_require(scope, &module_info, &expr.base.base.location);
47        return Some(WithPredicate::with_predicate_t(arena.add_type_pack_t(
48            TypePack {
49                head: vec![require_type],
50                tail: None,
51            },
52        )));
53    }
54
55    None
56}