Skip to main content

luaur_compiler/methods/
compiler_get_function_expr.rs

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