luaur_analysis/functions/
get_function_name_as_string.rs1use luaur_ast::records::ast_expr::AstExpr;
2use luaur_ast::records::ast_expr_global::AstExprGlobal;
3use luaur_ast::records::ast_expr_group::AstExprGroup;
4use luaur_ast::records::ast_expr_index_name::AstExprIndexName;
5use luaur_ast::records::ast_expr_local::AstExprLocal;
6
7pub fn get_function_name_as_string(expr: &AstExpr) -> Option<alloc::string::String> {
8 let mut curr = expr as *const AstExpr;
9 let mut s = alloc::string::String::new();
10
11 unsafe {
12 loop {
13 let local = luaur_ast::rtti::ast_node_as::<AstExprLocal>(
14 curr as *mut luaur_ast::records::ast_node::AstNode,
15 );
16 if !local.is_null() {
17 let name_ptr = (*(*local).local).name.value;
18 let mut name = if name_ptr.is_null() {
19 alloc::string::String::new()
20 } else {
21 core::ffi::CStr::from_ptr(name_ptr)
22 .to_string_lossy()
23 .into_owned()
24 };
25 name.push_str(&s);
26 return Some(name);
27 }
28
29 let global = luaur_ast::rtti::ast_node_as::<AstExprGlobal>(
30 curr as *mut luaur_ast::records::ast_node::AstNode,
31 );
32 if !global.is_null() {
33 let name_ptr = (*global).name.value;
34 let mut name = if name_ptr.is_null() {
35 alloc::string::String::new()
36 } else {
37 core::ffi::CStr::from_ptr(name_ptr)
38 .to_string_lossy()
39 .into_owned()
40 };
41 name.push_str(&s);
42 return Some(name);
43 }
44
45 let indexname = luaur_ast::rtti::ast_node_as::<AstExprIndexName>(
46 curr as *mut luaur_ast::records::ast_node::AstNode,
47 );
48 if !indexname.is_null() {
49 curr = (*indexname).expr;
50
51 let index_ptr = (*indexname).index.value;
52 let index_str = if index_ptr.is_null() {
53 alloc::string::String::new()
54 } else {
55 core::ffi::CStr::from_ptr(index_ptr)
56 .to_string_lossy()
57 .into_owned()
58 };
59
60 let mut new_s = alloc::string::String::new();
61 new_s.push('.');
62 new_s.push_str(&index_str);
63 new_s.push_str(&s);
64 s = new_s;
65
66 continue;
67 }
68
69 let group = luaur_ast::rtti::ast_node_as::<AstExprGroup>(
70 curr as *mut luaur_ast::records::ast_node::AstNode,
71 );
72 if !group.is_null() {
73 curr = (*group).expr;
74 continue;
75 }
76
77 return None;
78 }
79 }
80}