Skip to main content

luaur_analysis/methods/
lint_duplicate_function_visit.rs

1use 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}