Skip to main content

luaur_compiler/methods/
compiler_is_expr_mult_ret.rs

1use crate::functions::get_builtin_info::get_builtin_info;
2use crate::records::compiler::Compiler;
3use luaur_ast::records::ast_expr::AstExpr;
4use luaur_ast::records::ast_expr_call::AstExprCall;
5use luaur_ast::records::ast_expr_varargs::AstExprVarargs;
6use luaur_ast::records::ast_node::AstNode;
7use luaur_common::enums::luau_builtin_function::LuauBuiltinFunction;
8
9impl Compiler {
10    pub fn is_expr_mult_ret(&mut self, node: *mut AstExpr) -> bool {
11        unsafe {
12            let expr = luaur_ast::rtti::ast_node_as::<AstExprCall>(node as *mut AstNode);
13            if expr.is_null() {
14                return luaur_ast::rtti::ast_node_as::<AstExprVarargs>(node as *mut AstNode)
15                    .is_null()
16                    == false;
17            }
18
19            if self.options.optimization_level <= 1 {
20                return true;
21            }
22
23            if self.is_constant(expr as *mut AstExpr) {
24                return false;
25            }
26
27            if self.options.optimization_level >= 2 {
28                if let Some(bfid) = self.builtins.find(&expr) {
29                    if *bfid != LuauBuiltinFunction::LBF_NONE as i32 {
30                        return get_builtin_info(*bfid).results != 1;
31                    }
32                }
33            }
34
35            let func = self.get_function_expr((*expr).func);
36            let fi = if func.is_null() {
37                None
38            } else {
39                self.functions.find(&func)
40            };
41
42            if fi.map_or(false, |fi| fi.returns_one) {
43                return false;
44            }
45
46            true
47        }
48    }
49}