mirror of
https://github.com/neovim/neovim.git
synced 2025-12-16 19:35:37 +00:00
Ensure there is a nested table allocated for #set!
Fixes the following bug: ``` test/functional/helpers.lua:107: Error executing lua: vim/treesitter/query.lua:256: attempt to index a nil value ```
This commit is contained in:
@@ -253,7 +253,11 @@ local directive_handlers = {
|
|||||||
["set!"] = function(_, _, _, pred, metadata)
|
["set!"] = function(_, _, _, pred, metadata)
|
||||||
if #pred == 4 then
|
if #pred == 4 then
|
||||||
-- (#set! @capture "key" "value")
|
-- (#set! @capture "key" "value")
|
||||||
metadata[pred[2]][pred[3]] = pred[4]
|
local capture = pred[2]
|
||||||
|
if not metadata[capture] then
|
||||||
|
metadata[capture] = {}
|
||||||
|
end
|
||||||
|
metadata[capture][pred[3]] = pred[4]
|
||||||
else
|
else
|
||||||
-- (#set! "key" "value")
|
-- (#set! "key" "value")
|
||||||
metadata[pred[2]] = pred[3]
|
metadata[pred[2]] = pred[3]
|
||||||
|
|||||||
@@ -599,6 +599,56 @@ int x = INT_MAX;
|
|||||||
|
|
||||||
eq(result, "value")
|
eq(result, "value")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
describe("when setting a key on a capture", function()
|
||||||
|
it("it should create the nested table", function()
|
||||||
|
insert([[
|
||||||
|
int x = 3;
|
||||||
|
]])
|
||||||
|
|
||||||
|
local result = exec_lua([[
|
||||||
|
local query = require("vim.treesitter.query")
|
||||||
|
local value
|
||||||
|
|
||||||
|
query = vim.treesitter.parse_query("c", '((number_literal) @number (#set! @number "key" "value"))')
|
||||||
|
parser = vim.treesitter.get_parser(0, "c")
|
||||||
|
|
||||||
|
for pattern, match, metadata in query:iter_matches(parser:parse()[1]:root(), 0) do
|
||||||
|
for _, nested_tbl in pairs(metadata) do
|
||||||
|
return nested_tbl.key
|
||||||
|
end
|
||||||
|
end
|
||||||
|
]])
|
||||||
|
|
||||||
|
eq(result, "value")
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("it should not overwrite the nested table", function()
|
||||||
|
insert([[
|
||||||
|
int x = 3;
|
||||||
|
]])
|
||||||
|
|
||||||
|
local result = exec_lua([[
|
||||||
|
local query = require("vim.treesitter.query")
|
||||||
|
local result
|
||||||
|
|
||||||
|
query = vim.treesitter.parse_query("c", '((number_literal) @number (#set! @number "key" "value") (#set! @number "key2" "value2"))')
|
||||||
|
parser = vim.treesitter.get_parser(0, "c")
|
||||||
|
|
||||||
|
for pattern, match, metadata in query:iter_matches(parser:parse()[1]:root(), 0) do
|
||||||
|
for _, nested_tbl in pairs(metadata) do
|
||||||
|
return nested_tbl
|
||||||
|
end
|
||||||
|
end
|
||||||
|
]])
|
||||||
|
local expected = {
|
||||||
|
["key"] = "value",
|
||||||
|
["key2"] = "value2",
|
||||||
|
}
|
||||||
|
|
||||||
|
eq(expected, result)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|||||||
Reference in New Issue
Block a user