treesitter: avoid escaping complete query strings

Escape "\\" only for `vim-match?` not for `match?`
Fixes #12595
This commit is contained in:
Stephan Seitz
2020-08-30 21:53:16 +02:00
parent 2bbbb34ce7
commit b058c671d2
2 changed files with 31 additions and 2 deletions

View File

@@ -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

View File

@@ -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) {