Skip to main content

luaur_analysis/records/
frontend.rs

1//! Source: `Analysis/include/Luau/Frontend.h` (hand-ported; fields only)
2
3use crate::records::builtin_types::BuiltinTypes;
4use crate::records::config_resolver::ConfigResolver;
5use crate::records::file_resolver::FileResolver;
6use crate::records::frontend_module_resolver::FrontendModuleResolver;
7use crate::records::frontend_options::FrontendOptions;
8use crate::records::global_types::GlobalTypes;
9use crate::records::internal_error_reporter::InternalErrorReporter;
10use crate::records::require_trace_result::RequireTraceResult;
11use crate::records::source_module::SourceModule;
12use crate::records::source_node::SourceNode;
13use crate::type_aliases::scope_ptr_type::ScopePtr;
14use alloc::rc::Rc;
15use alloc::string::String;
16use alloc::sync::Arc;
17use alloc::vec::Vec;
18use core::sync::atomic::AtomicI32;
19use luaur_config::type_aliases::module_name::ModuleName;
20use std::collections::HashMap;
21
22/// Frontend::Stats (nested struct)
23#[derive(Debug, Clone, Copy, Default)]
24pub struct FrontendStats {
25    pub files: usize,
26    pub lines: usize,
27    pub files_strict: usize,
28    pub files_nonstrict: usize,
29    pub types_allocated: usize,
30    pub type_packs_allocated: usize,
31    pub bool_singletons_minted: usize,
32    pub str_singletons_minted: usize,
33    pub unique_str_singletons_minted: usize,
34    pub time_read: f64,
35    pub time_parse: f64,
36    pub time_check: f64,
37    pub time_lint: f64,
38    pub dynamic_constraints_created: usize,
39}
40
41pub struct Frontend {
42    pub use_new_luau_solver: AtomicI32,
43
44    pub environments: HashMap<String, ScopePtr>,
45    pub builtin_definitions: HashMap<String, Rc<dyn Fn(&mut Frontend, &mut GlobalTypes, ScopePtr)>>,
46
47    pub builtin_types_: BuiltinTypes,
48    pub builtin_types: *mut BuiltinTypes, // NotNull, points at builtin_types_
49
50    pub file_resolver: *mut FileResolver,
51    pub module_resolver: FrontendModuleResolver,
52    pub module_resolver_for_autocomplete: FrontendModuleResolver,
53    pub globals: GlobalTypes,
54    pub globals_for_autocomplete: GlobalTypes,
55    pub config_resolver: *mut ConfigResolver,
56    pub options: FrontendOptions,
57    pub ice_handler: InternalErrorReporter,
58    pub prepare_module_scope: Option<Rc<dyn Fn(&ModuleName, &ScopePtr, bool)>>,
59    pub write_json_log: Option<Rc<dyn Fn(&ModuleName, String)>>,
60
61    pub source_nodes: HashMap<ModuleName, Arc<SourceNode>>,
62    pub source_modules: HashMap<ModuleName, Arc<SourceModule>>,
63    pub require_trace: HashMap<ModuleName, RequireTraceResult>,
64
65    pub stats: FrontendStats,
66
67    pub module_queue: Vec<ModuleName>,
68}
69
70impl core::fmt::Debug for Frontend {
71    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
72        f.debug_struct("Frontend")
73            .field("use_new_luau_solver", &self.use_new_luau_solver)
74            .field("environments", &self.environments)
75            .field("builtin_definitions_len", &self.builtin_definitions.len())
76            .field("builtin_types_", &self.builtin_types_)
77            .field("builtin_types", &self.builtin_types)
78            .field("file_resolver", &self.file_resolver)
79            .field("module_resolver", &self.module_resolver)
80            .field(
81                "module_resolver_for_autocomplete",
82                &self.module_resolver_for_autocomplete,
83            )
84            .field("globals", &self.globals)
85            .field("globals_for_autocomplete", &self.globals_for_autocomplete)
86            .field("config_resolver", &self.config_resolver)
87            .field("options", &self.options)
88            .field("ice_handler", &self.ice_handler)
89            .field(
90                "prepare_module_scope",
91                &self.prepare_module_scope.as_ref().map(|_| "..."),
92            )
93            .field(
94                "write_json_log",
95                &self.write_json_log.as_ref().map(|_| "..."),
96            )
97            .field("source_nodes", &self.source_nodes)
98            .field("source_modules", &self.source_modules)
99            .field("require_trace", &self.require_trace)
100            .field("stats", &self.stats)
101            .field("module_queue", &self.module_queue)
102            .finish()
103    }
104}