luaur_analysis/records/
file_resolver.rs1use 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}