# CST 特性

> 

与 AST（抽象语法树）不同，CST（具体语法树）保留以下信息：

## 1. 注释保留

所有注释都保留在 CST 中，包括：

- 单行注释（`//`）
- 文档注释（`///`）
- 模块注释（`//!`）

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

## 2. 位置信息

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

```rust
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

<table>
<thead>
  <tr>
    <th>
      特性
    </th>
    
    <th>
      CST
    </th>
    
    <th>
      AST
    </th>
  </tr>
</thead>

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