diff options
author | Stephan Seitz <stephan.seitz@fau.de> | 2020-08-30 21:53:16 +0200 |
---|---|---|
committer | Stephan Seitz <stephan.seitz@fau.de> | 2020-08-31 17:24:38 +0200 |
commit | b058c671d2fb34b53d7499d77e7eb9624e1508a9 (patch) | |
tree | f5a2a1b97ee5aada5fd2fa753c0cc5c423df3a52 | |
parent | 2bbbb34ce78ee30c1ee53a9cb3fd1e7608185716 (diff) | |
download | rneovim-b058c671d2fb34b53d7499d77e7eb9624e1508a9.tar.gz rneovim-b058c671d2fb34b53d7499d77e7eb9624e1508a9.tar.bz2 rneovim-b058c671d2fb34b53d7499d77e7eb9624e1508a9.zip |
treesitter: avoid escaping complete query strings
Escape "\\" only for `vim-match?` not for `match?`
Fixes #12595
-rw-r--r-- | runtime/lua/vim/treesitter/query.lua | 4 | ||||
-rw-r--r-- | test/functional/lua/treesitter_spec.lua | 29 |
2 files changed, 31 insertions, 2 deletions
diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua index 17f61b24f1..803b9edbf0 100644 --- a/runtime/lua/vim/treesitter/query.lua +++ b/runtime/lua/vim/treesitter/query.lua @@ -17,7 +17,7 @@ local M = {} function M.parse_query(lang, query) language.require_language(lang) 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.captures = self.info.captures return self @@ -82,7 +82,7 @@ local predicate_handlers = { local compiled_vim_regexes = setmetatable({}, { __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) return res end diff --git a/test/functional/lua/treesitter_spec.lua b/test/functional/lua/treesitter_spec.lua index b0ac9e079a..5706272f38 100644 --- a/test/functional/lua/treesitter_spec.lua +++ b/test/functional/lua/treesitter_spec.lua @@ -198,6 +198,35 @@ void ui_refresh(void) }, res) 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() insert([[ int main(void) { |