Skip to main content

luaur_web/methods/
demo_file_resolver_resolve_module.rs

1//! `DemoFileResolver::resolveModule` (`CLI/src/Web.cpp:27-33`).
2//!
3//! ```cpp
4//! std::optional<Luau::ModuleInfo> resolveModule(const Luau::ModuleInfo* context, Luau::AstExpr* expr, const Luau::TypeCheckLimits& limits) override
5//! {
6//!     if (Luau::AstExprGlobal* g = expr->as<Luau::AstExprGlobal>())
7//!         return Luau::ModuleInfo{g->name.value};
8//!
9//!     return std::nullopt;
10//! }
11//! ```
12
13use crate::records::demo_file_resolver::DemoFileResolver;
14use core::ffi::CStr;
15use luaur_analysis::records::module_info::ModuleInfo;
16use luaur_analysis::records::type_check_limits::TypeCheckLimits;
17use luaur_analysis::type_aliases::module_name_file_resolver::ModuleName;
18use luaur_ast::records::ast_expr::AstExpr;
19use luaur_ast::records::ast_expr_global::AstExprGlobal;
20use luaur_ast::records::ast_node::AstNode;
21use luaur_ast::rtti::ast_node_as;
22
23impl DemoFileResolver {
24    pub fn resolve_module(
25        &self,
26        _context: *const ModuleInfo,
27        expr: *mut AstExpr,
28        _limits: &TypeCheckLimits,
29    ) -> Option<ModuleInfo> {
30        // expr->as<Luau::AstExprGlobal>()
31        let g = unsafe { ast_node_as::<AstExprGlobal>(expr as *mut AstNode) };
32        if g.is_null() {
33            return None;
34        }
35
36        // ModuleInfo{g->name.value} — g->name.value is the interned C string
37        // naming the global; its contents become the (string) ModuleName.
38        let value = unsafe { (*g).name.value };
39        let name: ModuleName = if value.is_null() {
40            ModuleName::default()
41        } else {
42            unsafe { CStr::from_ptr(value) }
43                .to_string_lossy()
44                .into_owned()
45        };
46
47        Some(ModuleInfo {
48            name,
49            optional: false,
50        })
51    }
52}