Skip to main content

luaur_analysis/records/
module_resolver.rs

1extern crate alloc;
2
3use alloc::string::String;
4
5use luaur_ast::records::ast_expr::AstExpr;
6
7use crate::records::module_info::ModuleInfo;
8use crate::type_aliases::module_name_type::ModuleName;
9use crate::type_aliases::module_ptr_module_resolver::ModulePtr;
10
11// C++ pure-virtual interface (ModuleResolver.h:18-49), ported with the
12// FileResolver struct+vtable pattern. Every entry is pure virtual in C++, so
13// there are no default fns; concrete resolvers fill the vtable.
14#[repr(C)]
15pub struct ModuleResolver {
16    pub vtable: ModuleResolverVtable,
17}
18
19#[derive(Clone, Copy)]
20pub struct ModuleResolverVtable {
21    /// Compute a ModuleInfo from the AST argument to require(). None = unable
22    /// to determine validity (type inference silently assumes success).
23    pub resolve_module_info: unsafe fn(
24        *mut ModuleResolver,
25        current_module_name: &ModuleName,
26        path_expr: *const AstExpr,
27    ) -> Option<ModuleInfo>,
28    /// Null when the module is unknown at compile time, or mid-typecheck on a cycle.
29    pub get_module: unsafe fn(*const ModuleResolver, module_name: &ModuleName) -> Option<ModulePtr>,
30    /// Distinguishes the two get_module-null cases.
31    pub module_exists: unsafe fn(*const ModuleResolver, module_name: &ModuleName) -> bool,
32    pub get_human_readable_module_name:
33        unsafe fn(*const ModuleResolver, module_name: &ModuleName) -> String,
34}