Windows 下的 Emacs 29.2 libtree-sitter.dll 太旧导致的 field 名字与字段错位问题

花了点时间写了个 WGSL 的 tree-sitter-grammar ,然后在官方提供的 emacs-29.2_1.zip 下使用 treesit-explore-mode 观察语法树,出现如下效果:

在语法定义中,我给函数名设置的 field 名字为 name ,给类型的是 type,但是途中 name 飘到了 fn 上面,type 飘到了 attribute 上面。tree-sitter parse 命令会得到如下正常结果:

(translation_unit [0, 0] - [3, 1]
  (function_decl [0, 0] - [3, 1]
    (attribute [0, 0] - [0, 12]
      (identifier [0, 1] - [0, 9])
      (int_literal [0, 10] - [0, 11]))
    (attribute [0, 13] - [0, 22]
      (identifier [0, 14] - [0, 19])
      (int_literal [0, 20] - [0, 21]))
    name: (identifier [1, 3] - [1, 7])
    (attribute [1, 13] - [1, 19]
      (identifier [1, 14] - [1, 19]))
    (attribute [1, 20] - [1, 26]
      (identifier [1, 21] - [1, 26]))
    type: (template_ident [1, 27] - [1, 30]
      name: (identifier [1, 27] - [1, 30]))
    body: (compound_statement [1, 31] - [3, 1])))

(草,按错键直接给我发出来了)

看了下 treesit.el 的提交历史,应该和这一条有关: Revert “Fix treesit-node-field-name and friends (bug#66674)”,观察 emacs-bug 上的提交可见提交者遇到了和我一样的问题,emacs 维护者首先修改 treesit.el 来修复 bug,后来发现是 tree-sitter 本身的 bug,待 tree-sitter 修复后又复原了 treesit.el 中的代码。

从 tree-sitter 仓库拉取最新代码后编译并替换原先的 libtree-sitter.dll 可以得到正确的结果:

2 个赞