Skip to main content

luaur_analysis/methods/
lint_duplicate_function_build_name.rs

1use crate::records::lint_duplicate_function::LintDuplicateFunction;
2use luaur_ast::records::ast_expr::AstExpr;
3use luaur_ast::records::ast_expr_global::AstExprGlobal;
4use luaur_ast::records::ast_expr_index_name::AstExprIndexName;
5use luaur_ast::records::ast_expr_local::AstExprLocal;
6use luaur_ast::records::ast_node::AstNode;
7use luaur_ast::rtti::ast_node_as;
8
9impl LintDuplicateFunction {
10    pub fn build_name(&self, expr: *mut AstExpr) -> String {
11        unsafe {
12            let local = ast_node_as::<AstExprLocal>(expr as *mut AstNode);
13            if let Some(local) = local.as_ref() {
14                let name = (*local.local).name;
15                if !name.value.is_null() {
16                    return core::ffi::CStr::from_ptr(name.value)
17                        .to_string_lossy()
18                        .into_owned();
19                }
20            }
21
22            let global = ast_node_as::<AstExprGlobal>(expr as *mut AstNode);
23            if let Some(global) = global.as_ref() {
24                let name = global.name;
25                if !name.value.is_null() {
26                    return core::ffi::CStr::from_ptr(name.value)
27                        .to_string_lossy()
28                        .into_owned();
29                }
30            }
31
32            let index_name = ast_node_as::<AstExprIndexName>(expr as *mut AstNode);
33            if let Some(index_name) = index_name.as_ref() {
34                let lhs = self.build_name(index_name.expr);
35                if lhs.is_empty() {
36                    return lhs;
37                }
38                let index = core::ffi::CStr::from_ptr(index_name.index.value).to_string_lossy();
39                return format!("{}.{}", lhs, index);
40            }
41        }
42        String::new()
43    }
44}