luaur_analysis/methods/
lint_duplicate_function_visit.rs1use crate::records::lint_duplicate_function::LintDuplicateFunction;
2use luaur_ast::records::ast_node::AstNode;
3use luaur_ast::records::ast_stat_block::AstStatBlock;
4use luaur_ast::records::ast_stat_function::AstStatFunction;
5use luaur_ast::records::ast_stat_local_function::AstStatLocalFunction;
6use luaur_ast::rtti::ast_node_as;
7
8impl LintDuplicateFunction {
9 pub fn visit_ast_stat_block(&mut self, block: *mut AstStatBlock) -> bool {
10 self.defns.clear();
11
12 let block_ref = unsafe { &*block };
13 let body = block_ref.body;
14
15 for i in 0..body.size {
16 let stat = unsafe { *body.data.add(i) };
17 let node = stat as *mut AstNode;
18
19 unsafe {
20 let func = ast_node_as::<AstStatFunction>(node);
21 if !func.is_null() {
22 self.track_function(
23 (*(*func).name).base.location,
24 &self.build_name((*func).name),
25 );
26 continue;
27 }
28
29 let local_func = ast_node_as::<AstStatLocalFunction>(node);
30 if !local_func.is_null() {
31 let name = (*(*local_func).name).name;
32 if !name.value.is_null() {
33 let name = core::ffi::CStr::from_ptr(name.value).to_string_lossy();
34 self.track_function((*(*local_func).name).location, &name);
35 }
36 }
37 }
38 }
39
40 true
41 }
42}