unluac 1.1.0

Multi-dialect Lua decompiler written in Rust.
Documentation
//! 这个文件承载 HIR 初始恢复的主入口。
//!
//! 外层文件只负责声明 analyze 子模块、组织跨 proto 的递归入口,并把目录内真正的
//! lowering 能力串起来。这样 `src/hir/analyze` 和 `src/hir/simplify` 的外层形状就会
//! 保持一致,后续继续拆分实现时也更容易定位“入口”与“细节”。

mod bindings;
mod exprs;
mod helpers;
mod lower;
mod short_circuit;
mod structure;
#[cfg(test)]
mod tests;

use self::lower::{ChildAnalyses, LowerArtifacts, lower_proto};
use super::simplify::simplify_hir;
use crate::cfg::{CfgGraph, DataflowFacts, GraphFacts};
use crate::hir::common::HirModule;
use crate::generate::GenerateMode;
use crate::readability::ReadabilityOptions;
use crate::structure::StructureFacts;
use crate::timing::TimingCollector;
use crate::transformer::LoweredChunk;

use self::exprs::lower_branch_cond;
use self::helpers::{assign_stmt, branch_stmt, build_label_map_for_summary, goto_block};
use self::lower::{
    ProtoBindings, ProtoLowering, is_control_terminator, lower_control_instr,
    lower_phi_materialization_with_allowed_blocks_except, lower_regular_instr,
};

/// 对整个 lowered chunk 递归构造 HIR。
#[allow(clippy::too_many_arguments)]
pub(crate) fn analyze_hir(
    chunk: &LoweredChunk,
    cfg_graph: &CfgGraph,
    graph_facts: &GraphFacts,
    dataflow: &DataflowFacts,
    structure: &StructureFacts,
    timings: &TimingCollector,
    readability: ReadabilityOptions,
    generate_mode: GenerateMode,
) -> HirModule {
    let child_analyses = ChildAnalyses {
        cfg_graphs: &cfg_graph.children,
        graph_facts: &graph_facts.children,
        dataflow: &dataflow.children,
        structure: &structure.children,
    };
    let mut artifacts = LowerArtifacts::default();
    let entry = timings.record("lower", || {
        lower_proto(
            &chunk.main,
            &cfg_graph.cfg,
            graph_facts,
            dataflow,
            structure,
            child_analyses,
            &mut artifacts,
        )
    });

    let mut module = HirModule {
        entry,
        protos: artifacts.protos,
    };

    timings.record("simplify", || {
        simplify_hir(
            &mut module,
            readability,
            timings,
            &artifacts.promotion_facts,
            generate_mode,
        );
    });
    module
}