luaur-compiler 0.1.3

Luau source-to-bytecode compiler (Rust).
Documentation
use crate::functions::get_builtin_info::get_builtin_info;
use crate::records::compiler::Compiler;
use luaur_ast::records::ast_expr::AstExpr;
use luaur_ast::records::ast_expr_call::AstExprCall;
use luaur_ast::records::ast_expr_varargs::AstExprVarargs;
use luaur_ast::records::ast_node::AstNode;
use luaur_common::enums::luau_builtin_function::LuauBuiltinFunction;

impl Compiler {
    pub fn is_expr_mult_ret(&mut self, node: *mut AstExpr) -> bool {
        unsafe {
            let expr = luaur_ast::rtti::ast_node_as::<AstExprCall>(node as *mut AstNode);
            if expr.is_null() {
                return luaur_ast::rtti::ast_node_as::<AstExprVarargs>(node as *mut AstNode)
                    .is_null()
                    == false;
            }

            if self.options.optimization_level <= 1 {
                return true;
            }

            if self.is_constant(expr as *mut AstExpr) {
                return false;
            }

            if self.options.optimization_level >= 2 {
                if let Some(bfid) = self.builtins.find(&expr) {
                    if *bfid != LuauBuiltinFunction::LBF_NONE as i32 {
                        return get_builtin_info(*bfid).results != 1;
                    }
                }
            }

            let func = self.get_function_expr((*expr).func);
            let fi = if func.is_null() {
                None
            } else {
                self.functions.find(&func)
            };

            if fi.map_or(false, |fi| fi.returns_one) {
                return false;
            }

            true
        }
    }
}