luaur-compiler 0.1.3

Luau source-to-bytecode compiler (Rust).
Documentation
use crate::records::compiler::Compiler;
use crate::records::reg_scope::RegScope;
use luaur_ast::records::ast_expr::AstExpr;
use luaur_ast::records::ast_expr_call::AstExprCall;
use luaur_ast::records::ast_expr_function::AstExprFunction;
use luaur_ast::records::ast_expr_global::AstExprGlobal;
use luaur_ast::records::ast_expr_local::AstExprLocal;
use luaur_ast::records::ast_expr_varargs::AstExprVarargs;
use luaur_ast::rtti;

impl Compiler {
    pub fn compile_expr_side(&mut self, node: *mut AstExpr) {
        unsafe {
            let ast_node = &*(node as *mut luaur_ast::records::ast_node::AstNode);
            if rtti::ast_node_is::<AstExprLocal>(ast_node)
                || rtti::ast_node_is::<AstExprGlobal>(ast_node)
                || rtti::ast_node_is::<AstExprVarargs>(ast_node)
                || rtti::ast_node_is::<AstExprFunction>(ast_node)
                || self.is_constant(node)
            {
                return;
            }

            if rtti::ast_node_as::<AstExprCall>(node as *mut luaur_ast::records::ast_node::AstNode)
                .is_null()
            {
                (*self.bytecode)
                    .add_debug_remark(format_args!("expression only compiled for side effects"));
            }

            let mut rsi = self.reg_scope_compiler();
            self.compile_expr_auto(node, &mut rsi);
        }
    }
}