Skip to main content

luaur_analysis/methods/
frontend_mark_dirty.rs

1use crate::records::frontend::Frontend;
2use crate::records::source_node::SourceNode;
3use crate::type_aliases::module_name_file_resolver::ModuleName;
4use alloc::boxed::Box;
5use alloc::vec::Vec;
6use luaur_common::macros::luau_timetrace_argument::LUAU_TIMETRACE_ARGUMENT;
7use luaur_common::macros::luau_timetrace_scope::LUAU_TIMETRACE_SCOPE;
8
9impl Frontend {
10    pub fn mark_dirty(&mut self, name: &ModuleName, marked_dirty: Option<&mut Vec<ModuleName>>) {
11        LUAU_TIMETRACE_SCOPE!("Frontend::markDirty", "Frontend");
12        LUAU_TIMETRACE_ARGUMENT!("name", name.as_str());
13
14        let marked_dirty_ptr = marked_dirty.map(|v| v as *mut Vec<ModuleName>);
15
16        self.traverse_dependents(
17            name,
18            Box::new(move |source_node: &mut SourceNode| {
19                if let Some(marked_dirty) = marked_dirty_ptr {
20                    unsafe {
21                        (*marked_dirty).push(source_node.name.clone());
22                    }
23                }
24
25                if source_node.dirty_source_module
26                    && source_node.dirty_module
27                    && source_node.dirty_module_for_autocomplete
28                {
29                    return false;
30                }
31
32                source_node.dirty_source_module = true;
33                source_node.dirty_module = true;
34                source_node.dirty_module_for_autocomplete = true;
35
36                true
37            }),
38        );
39    }
40}