fix(treesitter): support multiple @injection.content captures

Before, only the last capture's range would be counted for injection.
Now all captured ranges will be counted in the ranges array. This is
more intuitive, and also provides a nice solution/alternative to the
"scoped injections" issue.

(cherry picked from commit 8b41df185c)
This commit is contained in:
Riley Bruins
2025-06-06 16:00:18 -07:00
committed by github-actions[bot]
parent 8183eb32e1
commit dfeec113be
2 changed files with 7 additions and 2 deletions

View File

@ -573,7 +573,10 @@ parent tree. The language injection query allows you to specify these
“injections” using the following captures:
• `@injection.content` - indicates that the captured node should have its
contents re-parsed using another language.
contents re-parsed using another language. If there are multiple
`@injection.content` captures in one pattern, all ranges will be
collected and parsed as one tree. This allows query authors to create
"scoped" injections with injection query quantifiers.
• `@injection.language` - indicates that the captured nodes text may
contain the name of a language that should be used to re-parse the
`@injection.content`.

View File

@ -956,7 +956,9 @@ function LanguageTree:_get_injection(match, metadata)
local ft = vim.filetype.match({ filename = text })
lang = ft and resolve_lang(ft)
elseif name == 'injection.content' then
ranges = get_node_ranges(node, self._source, metadata[id], include_children)
for _, range in ipairs(get_node_ranges(node, self._source, metadata[id], include_children)) do
ranges[#ranges + 1] = range
end
end
end
end