luaur_analysis/functions/
get_string_contents.rs1use 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}