为什么 Deslop 使用 tree-sitter 解析源代码
Deslop 使用 tree-sitter 解析源文件,并比较归一化后的语法树。解析器为检测器提供稳定的结构化输入,无需依赖针对源代码文本的正则表达式。
原始文本匹配会漏掉什么
原始文本匹配容易受不改变程序结构的改动影响:
- 格式。 两个完全相同但格式不同的函数看起来像是不同的代码。
- 重命名。 在一个方法中把
user改成customer会破坏每一次匹配。
tree-sitter 让我们能做什么
tree-sitter 解析器为仓库中的每个文件生成一棵 AST。从这棵树出发,我们可以:
- 将标识符和字面量归一化为规范的占位符,使重命名坍缩到同一个指纹;
- 独立地哈希子树,使一个方法的指纹无论它位于文件中的何处都保持稳定;
- 在子树而非行上进行操作,使格式和空白字符变得无关紧要;
- 返回当前源代码快照中每个出现位置的精确字节范围。
不同语言的语法会以不同方式表示标识符、字面量与样板结构,因此归一化规则按语言实现。归一化后的语法树再进入共享的指纹、聚簇与排名流水线。
这对你意味着什么
- 重命名重构不会隐藏重复。 一个簇能在标识符重命名后存活,因为指纹是在归一化后的 AST 上计算的。
- 格式变更不会改变结构指纹。 使用
rustfmt重新格式化文件,不会改变 Deslop 所比较的语法结构。