mirror of
https://github.com/neovim/neovim
synced 2025-07-15 16:51:49 +00:00
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.
This commit is contained in:
@ -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, {})
|
||||
|
||||
|
Reference in New Issue
Block a user