luaur_analysis/methods/
magic_require_handle_old_solver.rs1use 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}