luaur_analysis/methods/
frontend_mark_dirty.rs1use 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}