diff options
author | Pham Huy Hoang <hoangtun0810@gmail.com> | 2023-11-29 23:16:52 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-29 08:16:52 -0600 |
commit | b6e339eb90e1a04f407f381739e46ad3c84f69c5 (patch) | |
tree | 73df467d5d9a8dc63ff03e8d773c2b77e7dc26da | |
parent | 7bc5ee7f9327e8210c78bd21935130840aaf63f2 (diff) | |
download | rneovim-b6e339eb90e1a04f407f381739e46ad3c84f69c5.tar.gz rneovim-b6e339eb90e1a04f407f381739e46ad3c84f69c5.tar.bz2 rneovim-b6e339eb90e1a04f407f381739e46ad3c84f69c5.zip |
fix(treesitter): make InspectTree correctly handle nested injections (#26085)
Problem: Only injections under the top level tree are found.
Solution: Iterate through all trees to find injections. When two
injections are contained within the same node in the parent tree, prefer
the injection with the larger byte length.
-rw-r--r-- | runtime/lua/vim/treesitter/dev.lua | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/runtime/lua/vim/treesitter/dev.lua b/runtime/lua/vim/treesitter/dev.lua index 1c581e3f29..aa4331946a 100644 --- a/runtime/lua/vim/treesitter/dev.lua +++ b/runtime/lua/vim/treesitter/dev.lua @@ -105,18 +105,23 @@ function TSTreeView:new(bufnr, lang) -- the root in the child tree to the {injections} table. local root = parser:parse(true)[1]:root() local injections = {} ---@type table<integer,table> - for _, child in pairs(parser:children()) do - child:for_each_tree(function(tree, ltree) - local r = tree:root() - local node = root:named_descendant_for_range(r:range()) - if node then - injections[node:id()] = { - lang = ltree:lang(), - root = r, - } - end - end) - end + + parser:for_each_tree(function(parent_tree, parent_ltree) + local parent = parent_tree:root() + for _, child in pairs(parent_ltree:children()) do + child:for_each_tree(function(tree, ltree) + local r = tree:root() + local node = assert(parent:named_descendant_for_range(r:range())) + local id = node:id() + if not injections[id] or r:byte_length() > injections[id].root:byte_length() then + injections[id] = { + lang = ltree:lang(), + root = r, + } + end + end) + end + end) local nodes = traverse(root, 0, parser:lang(), injections, {}) |