Skip to main content

luaur_analysis/functions/
get_function_name_as_string.rs

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