unluac 1.1.1

Multi-dialect Lua decompiler written in Rust.
Documentation
# Debugging

## 职责

Debugging 文档描述各层 dump 与 timing 的维护入口。

调试系统的作用是:

- 让每一层都能独立观察自己的正式事实
- 让跨层排错有稳定锚点
- 让性能排查能直接定位到 stage / pass

## 共享设施

### 公共契约 (`src/debug.rs`)

定义所有层共享的调试类型:`DebugDetail`、`DebugColorMode`、`DebugFilters`、`format_display_set()`。
各层 debug.rs 只依赖这些契约类型,不反向依赖 `decompile` 模块。

### 着色引擎 (`src/debug/colorize.rs`)

独立子模块,负责将多行调试文本按 token 类别着色输出。
对外仅通过 `crate::debug::colorize_debug_text` 暴露,不污染主契约文件。

### Pipeline 调试调度 (`src/decompile/debug.rs`)

通过 `define_stage_dump!` 宏统一生成所有 `dump_*` 公共包装函数。
启用 `decompile-debug` 时调用底层模块的 dump 函数并包装为 `StageDebugOutput`;
禁用时统一返回 `DebugUnavailable`,让 wasm 产物不带渲染逻辑。
新增阶段时只需增加一行宏调用。

## 各层 dump 入口

### parser

- `src/parser/debug.rs`
  - `dump_parser`
- dialect 专属 dump 在 `src/parser/dialect/*/debug.rs`

### transformer

- `src/transformer/debug.rs`
  - `dump_lir`

### cfg / graph / dataflow

- `src/cfg/debug.rs`
  - `dump_cfg`
  - `dump_graph_facts`
  - `dump_dataflow`

### structure

- `src/structure/debug.rs`
  - `dump_structure`

### hir

- `src/hir/debug.rs`
  - `dump_hir`

### ast / readability

- `src/ast/debug.rs`
  - `dump_ast`
  - `dump_readability`

### naming

- `src/naming/debug.rs`
  - `dump_naming`

### generate

- `src/generate/debug.rs`
  - `dump_generate`

## 维护规范

### 1. 每层 dump 只展示该层正式事实

例如:

- parser dump 只展示 raw
- transformer dump 只展示 low-IR 与 lowering map
- structure dump 只展示 structure facts

不要在某一层 dump 里重新计算下一层解释。

### 2. 跨层对照靠正式映射

跨层排错时,应优先使用:

- `Origin`
- `LoweringMap`
- `InstrRef / BlockRef / DefId / PhiId`
- function / proto 稳定索引

不要靠人工猜测“这大概是上一层哪一条”。

### 3. dump 优先稳定、紧凑、可过滤

新增 dump 字段时,优先考虑:

- 是否真能帮助定位问题
- 是否有稳定 id 可锚定
- 是否应放到 verbose 而不是默认输出

### 4. timing 只统计正式阶段

统一 timing 是维护入口的一部分。

它应覆盖:

- 总流水线
- 正式 stage
- 已显式建模的子阶段 / pass

不要制造假的子阶段名称来凑层级。

## 推荐排错顺序

1. 先看最早持有该事实的层的 dump。
2. 再看层间映射是否一致。
3. 最后才看消费者层是如何使用该事实的。

## 维护检查清单

修改某层时,应至少检查:

1. 对应 dump 是否仍能直接观察该层正式产物。
2. 新增共享事实是否需要出现在该层 dump 中。
3. 新增显式 pass / stage 是否需要接入 timing。
4. 是否已有稳定 id 与过滤器可定位新逻辑。