Skip to main content

luaur_analysis/functions/
get_string_contents.rs

1use alloc::string::String;
2use core::slice;
3use luaur_ast::records::ast_expr_constant_string::AstExprConstantString;
4use luaur_ast::records::ast_expr_interp_string::AstExprInterpString;
5use luaur_ast::records::ast_node::AstNode;
6use luaur_common::macros::luau_assert::LUAU_ASSERT;
7
8pub fn get_string_contents(node: *const AstNode) -> Option<String> {
9    if node.is_null() {
10        return None;
11    }
12
13    let node_ref = unsafe { &*node };
14
15    if let Some(string_node) = unsafe { node_ref.as_item::<AstExprConstantString>().as_ref() } {
16        let data = string_node.value.begin();
17        let size = string_node.value.len();
18        if !data.is_null() {
19            let slice = unsafe { slice::from_raw_parts(data as *const u8, size) };
20            return Some(String::from_utf8_lossy(slice).into_owned());
21        }
22    } else if let Some(interp_string) =
23        unsafe { node_ref.as_item::<AstExprInterpString>().as_ref() }
24    {
25        if interp_string.expressions.len() == 0 {
26            LUAU_ASSERT!(interp_string.strings.len() == 1);
27            let first_string_array = unsafe { &*interp_string.strings.begin() };
28            let data = first_string_array.begin();
29            let size = first_string_array.len();
30            if !data.is_null() {
31                let slice = unsafe { slice::from_raw_parts(data as *const u8, size) };
32                return Some(String::from_utf8_lossy(slice).into_owned());
33            }
34        }
35    }
36
37    None
38}