mirror of
https://github.com/neovim/neovim.git
synced 2025-09-08 12:28:18 +00:00
treesitter: avoid escaping complete query strings
Escape "\\" only for `vim-match?` not for `match?` Fixes #12595
This commit is contained in:
@@ -17,7 +17,7 @@ local M = {}
|
|||||||
function M.parse_query(lang, query)
|
function M.parse_query(lang, query)
|
||||||
language.require_language(lang)
|
language.require_language(lang)
|
||||||
local self = setmetatable({}, Query)
|
local self = setmetatable({}, Query)
|
||||||
self.query = vim._ts_parse_query(lang, vim.fn.escape(query,'\\'))
|
self.query = vim._ts_parse_query(lang, query)
|
||||||
self.info = self.query:inspect()
|
self.info = self.query:inspect()
|
||||||
self.captures = self.info.captures
|
self.captures = self.info.captures
|
||||||
return self
|
return self
|
||||||
@@ -82,7 +82,7 @@ local predicate_handlers = {
|
|||||||
|
|
||||||
local compiled_vim_regexes = setmetatable({}, {
|
local compiled_vim_regexes = setmetatable({}, {
|
||||||
__index = function(t, pattern)
|
__index = function(t, pattern)
|
||||||
local res = vim.regex(check_magic(pattern))
|
local res = vim.regex(check_magic(vim.fn.escape(pattern, '\\')))
|
||||||
rawset(t, pattern, res)
|
rawset(t, pattern, res)
|
||||||
return res
|
return res
|
||||||
end
|
end
|
||||||
|
@@ -198,6 +198,35 @@ void ui_refresh(void)
|
|||||||
}, res)
|
}, res)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('allow loading query with escaped quotes and capture them with `match?` and `vim-match?`', function()
|
||||||
|
if not check_parser() then return end
|
||||||
|
|
||||||
|
insert('char* astring = "Hello World!";')
|
||||||
|
|
||||||
|
local res = exec_lua([[
|
||||||
|
cquery = vim.treesitter.parse_query("c", '((_) @quote (vim-match? @quote "^\\"$")) ((_) @quote (match? @quote "^\\"$"))')
|
||||||
|
parser = vim.treesitter.get_parser(0, "c")
|
||||||
|
tree = parser:parse()
|
||||||
|
res = {}
|
||||||
|
for pattern, match in cquery:iter_matches(tree:root(), 0, 0, 1) do
|
||||||
|
-- can't transmit node over RPC. just check the name and range
|
||||||
|
local mrepr = {}
|
||||||
|
for cid,node in pairs(match) do
|
||||||
|
table.insert(mrepr, {cquery.captures[cid], node:type(), node:range()})
|
||||||
|
end
|
||||||
|
table.insert(res, {pattern, mrepr})
|
||||||
|
end
|
||||||
|
return res
|
||||||
|
]])
|
||||||
|
|
||||||
|
eq({
|
||||||
|
{ 1, { { "quote", '"', 0, 16, 0, 17 } } },
|
||||||
|
{ 2, { { "quote", '"', 0, 16, 0, 17 } } },
|
||||||
|
{ 1, { { "quote", '"', 0, 29, 0, 30 } } },
|
||||||
|
{ 2, { { "quote", '"', 0, 29, 0, 30 } } },
|
||||||
|
}, res)
|
||||||
|
end)
|
||||||
|
|
||||||
it('allows to add predicates', function()
|
it('allows to add predicates', function()
|
||||||
insert([[
|
insert([[
|
||||||
int main(void) {
|
int main(void) {
|
||||||
|
Reference in New Issue
Block a user