CST 特性

与 AST(抽象语法树)不同,CST(具体语法树)保留以下信息:

1. 注释保留

所有注释都保留在 CST 中,包括:

  • 单行注释(//
  • 文档注释(///
  • 模块注释(//!

注释存储在对应节点的 comments 字段中。

2. 位置信息

每个节点包含精确的位置范围:

pub struct Span {
    pub start: Position,
    pub end: Position,
}

pub struct Position {
    pub line: usize,
    pub column: usize,
    pub offset: usize,
}

位置信息用于:

  • 错误报告
  • 源代码映射
  • 调试信息
  • LSP 支持

3. 语法结构

保留完整的语法结构,包括所有标点符号:

  • 括号:(), {}, []
  • 标点::, ,, ;
  • 运算符:+, -, *, /, etc.

这使得 CST 可以精确重建源代码。

4. 源代码重建

可以从 CST 精确重建源代码,包括:

  • 所有语法结构
  • 所有注释
  • 原始格式(通过位置信息)

LSP 功能支持

CST 特性为以下 LSP 功能提供了更好的支持:

悬停提示

从 CST 节点的 comments 字段提取文档注释,显示在悬停提示中。

代码补全

利用 CST 的完整结构信息提供智能代码补全。

跳转定义

利用 CST 的位置信息实现精确的跳转定义功能。

错误报告

利用 CST 的位置信息提供准确的错误位置和上下文。

CST vs AST

特性CSTAST
注释保留丢弃
位置信息精确可能不完整
语法结构完整抽象
源代码重建可行困难
适用场景LSP、格式化编译、优化