luaur_compiler/methods/
compiler_get_function_expr.rs1use crate::records::compiler::Compiler;
2use luaur_ast::records::ast_expr::AstExpr;
3use luaur_ast::records::ast_expr_function::AstExprFunction;
4use luaur_ast::records::ast_expr_group::AstExprGroup;
5use luaur_ast::records::ast_expr_index_name::AstExprIndexName;
6use luaur_ast::records::ast_expr_instantiate::AstExprInstantiate;
7use luaur_ast::records::ast_expr_local::AstExprLocal;
8use luaur_ast::records::ast_expr_type_assertion::AstExprTypeAssertion;
9use luaur_ast::records::ast_node::AstNode;
10
11impl Compiler {
12 pub fn get_function_expr(&mut self, node: *mut AstExpr) -> *mut AstExprFunction {
13 unsafe {
14 let expr_local = luaur_ast::rtti::ast_node_as::<AstExprLocal>(node as *mut AstNode);
15 if !expr_local.is_null() {
16 let lv = self.variables.find(&(*expr_local).local);
17 if lv.map_or(true, |lv| lv.written || lv.init.is_null()) {
18 return core::ptr::null_mut();
19 }
20
21 return self.get_function_expr(lv.unwrap().init);
22 }
23
24 let expr_index = luaur_ast::rtti::ast_node_as::<AstExprIndexName>(node as *mut AstNode);
25 if !expr_index.is_null() && luaur_common::FFlag::LuauCompileInlineTableFunctions.get() {
26 let value = self.try_index_constant_table(expr_index);
27 if !value.is_null() {
28 return self.get_function_expr(value);
29 }
30
31 return core::ptr::null_mut();
32 }
33
34 let expr_group = luaur_ast::rtti::ast_node_as::<AstExprGroup>(node as *mut AstNode);
35 if !expr_group.is_null() {
36 return self.get_function_expr((*expr_group).expr);
37 }
38
39 let expr_assertion =
40 luaur_ast::rtti::ast_node_as::<AstExprTypeAssertion>(node as *mut AstNode);
41 if !expr_assertion.is_null() {
42 return self.get_function_expr((*expr_assertion).expr);
43 }
44
45 let expr_instantiate =
46 luaur_ast::rtti::ast_node_as::<AstExprInstantiate>(node as *mut AstNode);
47 if !expr_instantiate.is_null()
48 && luaur_common::FFlag::LuauCompileInlineTableFunctions.get()
49 {
50 return self.get_function_expr((*expr_instantiate).expr);
51 }
52
53 luaur_ast::rtti::ast_node_as::<AstExprFunction>(node as *mut AstNode)
54 }
55 }
56}