mirror of
https://github.com/neovim/neovim.git
synced 2024-12-23 12:45:17 -07: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:
parent
7bc5ee7f93
commit
b6e339eb90
@ -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, {})
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user