#2825·ast-grep

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编译器中包含了遗留的语法和有意的不正确/错误的回收装置,其中候选人出现在包接节点下方。 这些情况表明,必须逐一宣布跨越边界,而且必须与仍然需要深入跨越界限的规则正确并存。

□ 要求

  1. 允许对项目和成员概要规则作 " StopBy " 的说明。
  • 支持至少停止:结束'和停止:立即'。
  • 通过默认保留当前行为省略了停止 ' 到结束'。
  • 对于项目规则,评估相对于文件根 AST 节点的边界。
  • 对于成员规则,评估与所附匹配项目相接的边界。
  1. 一项带有 " stopBy:即时 " 的规则,在访问其源节点的非即时后代时不得参加。
  • 在混合规则中, " 最终 " 规则必须继续在直接子女以下参与。
  • 合格节点的规则顺序/优先位置应保持不变。
  1. 如果所有关于横贯范围的现行规则都是`立即'的,则不得超出源节点的直接子女。
  • 对于项目倒转,请在大纲选项过滤了规则集后从保留的项目规则中确定。
  • 对于成员转接,请根据适用于所附项目规则ID和现行成员选项的成员规则确定这一点。

□ 接受标准

  • 增加项目和成员`StopBy'(包括默认值)的计划/去区域化覆盖面。
  • 为立即和混合的即时/后端物品规则增加横向测试。
  • 在所附项目中加入对成员规则的同等测试。
  • 核实一个即刻的范畴会扭曲后代,而不仅仅是跳过匹配者评价。
  • 仅注释捆绑的规则,其匹配候选人由角色的源节点直接拥有.
  • 开放码上的基准 " 立项大纲 -- -- 项目出口 " 确认产出 . . . . . . .

内容来源: ast-grep/ast-grep