# delc Specification v1.0
## 1. 概述
`delc` 是一个命令行工具,递归删除当前目录及其子目录下所有 `.rs` 文件中的注释。
### 注释类型
| 行注释 | `//` 至行尾 | `// 注释`、`/// 文档`、`//! 内部文档` |
| 块注释 | `/*` 至 `*/`(支持嵌套) | `/* 注释 */`、`/** 文档 */` |
`///` 和 `//!` 均以 `//` 开头,行注释规则自动覆盖。`/** **/` 以 `/*` 开头,块注释规则自动覆盖。
## 2. 功能需求
### 2.1 文件发现
- 从当前工作目录(`std::env::current_dir()`)开始,**递归**遍历所有子目录
- 仅处理 `.rs` 扩展名的文件
- 不处理 `.gitignore`,直接遍历文件系统
- 如果当前目录下没有任何 `.rs` 文件,输出 `"处理了 0 个文件,删除了 0 条注释"` 并成功退出
### 2.2 注释解析规则
解析器实现字符级状态机,正确处理以下场景:
#### 2.2.1 行注释 `//`
- `//` 至行尾的所有字符均为注释内容(不输出)
- 包括 `///`(外部文档注释)和 `//!`(内部文档注释)
- **行内注释**:若 `//` 前有代码,仅删除注释部分,保留代码
- **纯注释行**:若整行只有注释(可含前导空白),整行移除,不产生空白行
#### 2.2.2 块注释 `/* */`
- `/*` 开始至最近匹配的 `*/` 结束
- **支持嵌套**:使用深度计数器,每遇 `/*` depth+1,每遇 `*/` depth-1
- 未闭合的块注释(文件结束时 depth > 0):panic 退出
#### 2.2.3 字符串字面量内的"假注释"
以下内容不被视为注释:
| 普通字符串 | `let s = "// 不是注释";` |
| 转义引号 | `let s = "say \"hello\"";` |
| 原始字符串 | `let s = r"// 不是注释";` |
| 带井号原始字符串 | `let s = r#"/* 不是 */"#;` |
| 多层井号 | `let s = r##"//"##;` |
字符字面量 `'x'` 不需特殊处理(单字符内不可能出现 `//` 或 `/*`)。
### 2.3 输出处理
- rtrim 每行尾部空白,移除所有空白行
- 仅处理 UTF-8 编码文件,遇非 UTF-8 字节 panics
- **原地覆盖**写入,不备份
### 2.4 错误处理
所有错误均直接 panic:
| 文件读取失败 | panic |
| 文件写入失败 | panic |
| 非 UTF-8 编码 | panic |
| 未闭合的块注释 | panic |
| 目录遍历失败 | panic |
## 3. CLI 接口
```bash
delc
```
无任何命令行参数。向 stdout 输出被修改文件的相对路径,以及一行统计:
```
处理了 <N> 个文件,删除了 <M> 条注释:
path/to/file1.rs
path/to/file2.rs
```
- 每个被修改的文件输出其相对于当前工作目录的路径,每行一个,缩进 2 空格
- 若没有任何注释被删除,仅输出 `"处理了 0 个文件,删除了 0 条注释"`(不列出文件)
- N:被修改的文件数量(仅统计有注释被删除的文件)
- M:删除的注释总条数(行注释计1条,整个块注释计1条,无论嵌套层级)
## 4. 技术细节
- Rust >= 1.95.0,Edition 2024
- 零外部依赖,仅使用标准库