neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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:
Mruntime/doc/treesitter.txt | 5++++-
Mruntime/lua/vim/treesitter/languagetree.lua | 4+++-
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