aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/lua/vim/treesitter/query.lua9
-rw-r--r--test/functional/treesitter/parser_spec.lua30
2 files changed, 39 insertions, 0 deletions
diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua
index e68acac929..36c78b7f1d 100644
--- a/runtime/lua/vim/treesitter/query.lua
+++ b/runtime/lua/vim/treesitter/query.lua
@@ -529,6 +529,9 @@ local directive_handlers = {
['offset!'] = function(match, _, _, pred, metadata)
local capture_id = pred[2] --[[@as integer]]
local nodes = match[capture_id]
+ if not nodes or #nodes == 0 then
+ return
+ end
assert(#nodes == 1, '#offset! does not support captures on multiple nodes')
local node = nodes[1]
@@ -562,6 +565,9 @@ local directive_handlers = {
assert(type(id) == 'number')
local nodes = match[id]
+ if not nodes or #nodes == 0 then
+ return
+ end
assert(#nodes == 1, '#gsub! does not support captures on multiple nodes')
local node = nodes[1]
local text = vim.treesitter.get_node_text(node, bufnr, { metadata = metadata[id] }) or ''
@@ -584,6 +590,9 @@ local directive_handlers = {
assert(type(capture_id) == 'number')
local nodes = match[capture_id]
+ if not nodes or #nodes == 0 then
+ return
+ end
assert(#nodes == 1, '#trim! does not support captures on multiple nodes')
local node = nodes[1]
diff --git a/test/functional/treesitter/parser_spec.lua b/test/functional/treesitter/parser_spec.lua
index 1166166530..dbd6bb3c23 100644
--- a/test/functional/treesitter/parser_spec.lua
+++ b/test/functional/treesitter/parser_spec.lua
@@ -547,6 +547,36 @@ int x = INT_MAX;
end)
end)
+ describe('when setting the node for an injection', function()
+ before_each(function()
+ insert([[
+print()
+ ]])
+ end)
+
+ it('ignores optional captures #23100', function()
+ local result = exec_lua([[
+ parser = vim.treesitter.get_parser(0, "lua", {
+ injections = {
+ lua = (
+ '(function_call ' ..
+ '(arguments ' ..
+ '(string)? @injection.content ' ..
+ '(number)? @injection.content ' ..
+ '(#offset! @injection.content 0 1 0 -1) ' ..
+ '(#set! injection.language "c")))'
+ )
+ }
+ })
+ parser:parse(true)
+
+ return parser:is_valid()
+ ]])
+
+ eq(true, result)
+ end)
+ end)
+
describe('when getting/setting match data', function()
describe('when setting for the whole match', function()
it('should set/get the data correctly', function()