luaur_analysis/methods/
frontend_module_resolver_frontend_module_resolver.rs1use crate::records::frontend::Frontend;
5use crate::records::frontend_module_resolver::FrontendModuleResolver;
6use crate::records::module_info::ModuleInfo;
7use crate::records::module_resolver::{ModuleResolver, ModuleResolverVtable};
8use crate::type_aliases::module_name_type::ModuleName;
9use crate::type_aliases::module_ptr_module_resolver::ModulePtr;
10use luaur_ast::records::ast_expr::AstExpr;
11use std::collections::HashMap;
12use std::sync::Mutex;
13
14impl FrontendModuleResolver {
15 pub fn new(frontend: *mut Frontend) -> Self {
16 Self {
17 base: ModuleResolver {
18 vtable: ModuleResolverVtable {
19 resolve_module_info: frontend_module_resolver_resolve_module_info,
20 get_module: frontend_module_resolver_get_module,
21 module_exists: frontend_module_resolver_module_exists,
22 get_human_readable_module_name:
23 frontend_module_resolver_get_human_readable_module_name,
24 },
25 },
26 frontend,
27 module_mutex: Mutex::new(()),
28 modules: HashMap::new(),
29 }
30 }
31}
32
33unsafe fn frontend_module_resolver_resolve_module_info(
34 this: *mut ModuleResolver,
35 current_module_name: &ModuleName,
36 path_expr: *const AstExpr,
37) -> Option<ModuleInfo> {
38 if path_expr.is_null() {
39 return None;
40 }
41
42 let resolver = this as *const FrontendModuleResolver;
43 unsafe { (*resolver).resolve_module_info(current_module_name, &*path_expr) }
44}
45
46unsafe fn frontend_module_resolver_get_module(
47 this: *const ModuleResolver,
48 module_name: &ModuleName,
49) -> Option<ModulePtr> {
50 let resolver = this as *const FrontendModuleResolver;
51 let _lock = unsafe { (*resolver).module_mutex.lock().unwrap() };
52 unsafe { (*resolver).modules.get(module_name).cloned() }
53}
54
55unsafe fn frontend_module_resolver_module_exists(
56 this: *const ModuleResolver,
57 module_name: &ModuleName,
58) -> bool {
59 let resolver = this as *const FrontendModuleResolver;
60 unsafe { (*resolver).module_exists(module_name) }
61}
62
63unsafe fn frontend_module_resolver_get_human_readable_module_name(
64 this: *const ModuleResolver,
65 module_name: &ModuleName,
66) -> String {
67 let resolver = this as *const FrontendModuleResolver;
68 unsafe { (*resolver).get_human_readable_module_name(module_name) }
69}