luaur-compiler 0.1.2

Luau source-to-bytecode compiler (Rust).
Documentation
use crate::enums::table_constant_kind::TableConstantKind;
use crate::functions::unwrap_expr_of_type::unwrap_expr_of_type;
use crate::records::table_mutation_tracker::TableMutationTracker;
use crate::records::table_mutation_tracker_deprecated::TableMutationTrackerDeprecated;
use crate::records::variable::Variable;
use luaur_ast::records::ast_expr_table::AstExprTable;
use luaur_ast::records::ast_local::AstLocal;
use luaur_ast::records::ast_node::AstNode;
use luaur_common::records::dense_hash_map::DenseHashMap;

pub fn build_table_constant_map(
    result: &mut DenseHashMap<*mut AstLocal, TableConstantKind>,
    variables: &DenseHashMap<*mut AstLocal, Variable>,
    root: *mut AstNode,
) {
    luaur_common::LUAU_ASSERT!(
        luaur_common::FFlag::LuauCompileFoldOptimize.get()
            && luaur_common::FFlag::LuauCompilePropagateTableProps2.get()
    );

    if luaur_common::FFlag::LuauCompileNewTableMutationTracker.get() {
        let mut tracker = TableMutationTracker::table_mutation_tracker(variables);
        unsafe {
            luaur_ast::visit::ast_node_visit(root, &mut tracker);
        }

        for (local, var) in variables.iter() {
            if var.written {
                continue;
            }

            if var.init.is_null() || unwrap_expr_of_type::<AstExprTable>(var.init).is_null() {
                continue;
            }

            if !tracker.escaped.contains(local) {
                *result.get_or_insert(*local) = TableConstantKind::ConstantTable;
            }
        }
    } else {
        let mut mutation_tracker =
            TableMutationTrackerDeprecated::table_mutation_tracker_deprecated(result, variables);
        unsafe {
            luaur_ast::visit::ast_node_visit(root, &mut mutation_tracker);
        }
    }
}