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