Skip to main content

luaur_analysis/methods/
frontend_module_resolver_frontend_module_resolver.rs

1//! C++ `FrontendModuleResolver::FrontendModuleResolver(Frontend* frontend)`
2//! (`Analysis/src/Frontend.cpp:1922`): stores the owning frontend; `modules`
3//! and `moduleMutex` are default-initialized.
4use 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}