Skip to main content

luaur_analysis/methods/
frontend_parse_modules.rs

1use crate::records::frontend::Frontend;
2use crate::records::type_check_limits::TypeCheckLimits;
3use crate::type_aliases::module_name_file_resolver::ModuleName;
4use alloc::vec::Vec;
5use luaur_common::macros::luau_timetrace_scope::LUAU_TIMETRACE_SCOPE;
6use luaur_common::records::dense_hash_set::DenseHashSet;
7
8impl Frontend {
9    pub fn parse_modules(&mut self, names: &Vec<ModuleName>) {
10        LUAU_TIMETRACE_SCOPE!("Frontend::parseModules", "Frontend");
11
12        let mut seen: DenseHashSet<ModuleName> = DenseHashSet::new(ModuleName::default());
13
14        for name in names {
15            if seen.contains(name) {
16                continue;
17            }
18
19            if let Some(node) = self.source_nodes.get(name) {
20                if !node.has_dirty_source_module() {
21                    seen.insert(name.clone());
22                    continue;
23                }
24            }
25
26            let mut queue: Vec<ModuleName> = Vec::new();
27            // C++ passes a `seenSet` predicate to `parseGraph` to short-circuit
28            // already-seen modules during traversal. The Rust `parse_graph` does
29            // not expose that callback; the top-level `seen` set below still
30            // prevents redundant re-parsing of root modules.
31            self.parse_graph(&mut queue, name, &TypeCheckLimits::default(), false);
32
33            seen.insert(name.clone());
34        }
35    }
36}