Skip to main content

luaur_analysis/records/
file_resolver.rs

1use crate::records::module_info::ModuleInfo;
2use crate::records::require_suggester::RequireSuggester;
3use crate::records::source_code::SourceCode;
4use crate::records::type_check_limits::TypeCheckLimits;
5use crate::type_aliases::module_name_file_resolver::ModuleName;
6use alloc::string::String;
7use alloc::sync::Arc;
8use luaur_ast::records::ast_expr::AstExpr;
9
10#[repr(C)]
11pub struct FileResolver {
12    pub vtable: FileResolverVtable,
13    pub require_suggester: Option<Arc<RequireSuggester>>,
14}
15
16#[derive(Clone, Copy)]
17pub struct FileResolverVtable {
18    pub read_source: unsafe fn(*mut FileResolver, name: &ModuleName) -> Option<SourceCode>,
19    pub resolve_module: unsafe fn(
20        *mut FileResolver,
21        context: *const ModuleInfo,
22        expr: *mut AstExpr,
23        limits: &TypeCheckLimits,
24    ) -> Option<ModuleInfo>,
25    pub get_human_readable_module_name: unsafe fn(*const FileResolver, name: &ModuleName) -> String,
26    pub get_environment_for_module:
27        unsafe fn(*const FileResolver, name: &ModuleName) -> Option<String>,
28}
29
30pub(crate) unsafe fn file_resolver_resolve_module_default(
31    _this: *mut FileResolver,
32    _context: *const ModuleInfo,
33    _expr: *mut AstExpr,
34    _limits: &TypeCheckLimits,
35) -> Option<ModuleInfo> {
36    None
37}
38
39pub(crate) unsafe fn file_resolver_get_human_readable_module_name_default(
40    _this: *const FileResolver,
41    name: &ModuleName,
42) -> String {
43    name.clone()
44}
45
46pub(crate) unsafe fn file_resolver_get_environment_for_module_default(
47    _this: *const FileResolver,
48    _name: &ModuleName,
49) -> Option<String> {
50    None
51}
52
53impl FileResolver {
54    pub unsafe fn read_source(this: *mut FileResolver, name: &ModuleName) -> Option<SourceCode> {
55        ((*this).vtable.read_source)(this, name)
56    }
57
58    pub unsafe fn resolve_module(
59        this: *mut FileResolver,
60        context: *const ModuleInfo,
61        expr: *mut AstExpr,
62        limits: &TypeCheckLimits,
63    ) -> Option<ModuleInfo> {
64        ((*this).vtable.resolve_module)(this, context, expr, limits)
65    }
66
67    pub unsafe fn get_human_readable_module_name(
68        this: *const FileResolver,
69        name: &ModuleName,
70    ) -> String {
71        ((*this).vtable.get_human_readable_module_name)(this, name)
72    }
73
74    pub unsafe fn get_environment_for_module(
75        this: *const FileResolver,
76        name: &ModuleName,
77    ) -> Option<String> {
78        ((*this).vtable.get_environment_for_module)(this, name)
79    }
80}
81
82impl core::fmt::Debug for FileResolver {
83    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
84        f.debug_struct("FileResolver")
85            .field("require_suggester", &self.require_suggester)
86            .finish()
87    }
88}