luaur-compiler 0.1.2

Luau source-to-bytecode compiler (Rust).
Documentation
use crate::enums::type_constant_folding::Type;
use crate::records::compiler::Compiler;
use crate::records::constant::Constant;
use luaur_ast::records::ast_expr::AstExpr;
use luaur_ast::records::ast_expr_binary::AstExprBinary;
use luaur_ast::records::ast_expr_binary::AstExprBinary_Op;
use luaur_ast::records::ast_expr_group::AstExprGroup;
use luaur_ast::records::ast_node::AstNode;
use luaur_common::records::dense_hash_map::DenseHashMap;

impl Compiler {
    pub fn is_condition_fast(&mut self, node: *mut AstExpr) -> bool {
        unsafe {
            if node.is_null() {
                return false;
            }

            let cv = self.constants.find(&node);

            if let Some(constant) = cv {
                if (*constant).r#type != Type::Type_Unknown {
                    return true;
                }
            }

            let binary = luaur_ast::rtti::ast_node_as::<AstExprBinary>(node as *mut AstNode);
            if !binary.is_null() {
                match (*binary).op {
                    AstExprBinary_Op::And
                    | AstExprBinary_Op::Or
                    | AstExprBinary_Op::CompareNe
                    | AstExprBinary_Op::CompareEq
                    | AstExprBinary_Op::CompareLt
                    | AstExprBinary_Op::CompareLe
                    | AstExprBinary_Op::CompareGt
                    | AstExprBinary_Op::CompareGe => return true,
                    _ => return false,
                }
            }

            let group = luaur_ast::rtti::ast_node_as::<AstExprGroup>(node as *mut AstNode);
            if !group.is_null() {
                return self.is_condition_fast((*group).expr);
            }

            false
        }
    }
}