mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +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
	 Stephan Seitz
					Stephan Seitz