perf(outline): 添加按规则停止的遍历限制
作者: HerringtonDarkholme创建于 2026年7月20日更新于 2026年7月24日
□ 背景情况
在改进了剖面器的性能(包括使用自定义的优化植树器建造进行测试)后,树轮图轨成为了"ast-grep turn"运行时间中更能见度的部分. 将已识别出大纲 traversal作为有意义的热点: traversal目前在整个文件树上考虑保留项规则,在整个匹配项子树上考虑成员规则,即使一个规则只能有效匹配其源节点直接拥有的节点.
源节点应当由提取器角色定义:
- 项目规则:文件的根 AST 节点
- 成员规则:由母项提取器匹配的附件项
一个将根自有的TypeScript/TSX导出和命名空间/容器项目规则标记为即时的实验显示,出口模式下的开口码存储器有重大改进。 利用最优化的剖析器构建,光圈输出仍然相同(1,455个文件和7,575个物品),而中位壁时间从174.6 ms下降到151.8 ms (13.1%),用户CPU从1.551 s下降到1.333 s (14.1%).
然而,立即全面转换是不正确的。 TypeScript编译器中包含了遗留的语法和有意的不正确/错误的回收装置,其中候选人出现在包接节点下方。 这些情况表明,必须逐一宣布跨越边界,而且必须与仍然需要深入跨越界限的规则正确并存。
□ 要求
- 允许对项目和成员概要规则作 " StopBy " 的说明。
- 支持至少
停止:结束'和停止:立即'。 - 通过默认保留当前行为省略了
停止 ' 到结束'。 - 对于项目规则,评估相对于文件根 AST 节点的边界。
- 对于成员规则,评估与所附匹配项目相接的边界。
- 一项带有 " stopBy:即时 " 的规则,在访问其源节点的非即时后代时不得参加。
- 在混合规则中, " 最终 " 规则必须继续在直接子女以下参与。
- 合格节点的规则顺序/优先位置应保持不变。
- 如果所有关于横贯范围的现行规则都是`立即'的,则不得超出源节点的直接子女。
- 对于项目倒转,请在大纲选项过滤了规则集后从保留的项目规则中确定。
- 对于成员转接,请根据适用于所附项目规则ID和现行成员选项的成员规则确定这一点。
□ 接受标准
- 增加项目和成员`StopBy'(包括默认值)的计划/去区域化覆盖面。
- 为立即和混合的即时/后端物品规则增加横向测试。
- 在所附项目中加入对成员规则的同等测试。
- 核实一个即刻的范畴会扭曲后代,而不仅仅是跳过匹配者评价。
- 仅注释捆绑的规则,其匹配候选人由角色的源节点直接拥有.
- 开放码上的基准 " 立项大纲 -- -- 项目出口 " 确认产出 . . . . . . .
内容来源: ast-grep/ast-grep