commit 8b41df185c307befe484d26defa1a81697aeb1c9
parent 775e845d5993e1b8f60d478174cfb12588b44185
Author: Riley Bruins <ribru17@hotmail.com>
Date: Fri, 6 Jun 2025 16:00:18 -0700
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.
Diffstat:
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/runtime/doc/treesitter.txt b/runtime/doc/treesitter.txt
@@ -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 node’s text may
contain the name of a language that should be used to re-parse the
`@injection.content`.
diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua
@@ -1013,7 +1013,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