花了点时间写了个 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 可以得到正确的结果: