mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	refactor(treesitter): simplify some range functions
This commit is contained in:
		| @@ -2,6 +2,7 @@ local a = vim.api | |||||||
| local query = require('vim.treesitter.query') | local query = require('vim.treesitter.query') | ||||||
| local language = require('vim.treesitter.language') | local language = require('vim.treesitter.language') | ||||||
| local LanguageTree = require('vim.treesitter.languagetree') | local LanguageTree = require('vim.treesitter.languagetree') | ||||||
|  | local Range = require('vim.treesitter._range') | ||||||
|  |  | ||||||
| ---@type table<integer,LanguageTree> | ---@type table<integer,LanguageTree> | ||||||
| local parsers = setmetatable({}, { __mode = 'v' }) | local parsers = setmetatable({}, { __mode = 'v' }) | ||||||
| @@ -190,20 +191,7 @@ end | |||||||
| --- | --- | ||||||
| ---@return boolean True if the position is in node range | ---@return boolean True if the position is in node range | ||||||
| function M.is_in_node_range(node, line, col) | function M.is_in_node_range(node, line, col) | ||||||
|   local start_line, start_col, end_line, end_col = M.get_node_range(node) |   return M.node_contains(node, { line, col, line, col }) | ||||||
|   if line >= start_line and line <= end_line then |  | ||||||
|     if line == start_line and line == end_line then |  | ||||||
|       return col >= start_col and col < end_col |  | ||||||
|     elseif line == start_line then |  | ||||||
|       return col >= start_col |  | ||||||
|     elseif line == end_line then |  | ||||||
|       return col < end_col |  | ||||||
|     else |  | ||||||
|       return true |  | ||||||
|     end |  | ||||||
|   else |  | ||||||
|     return false |  | ||||||
|   end |  | ||||||
| end | end | ||||||
|  |  | ||||||
| --- Determines if a node contains a range | --- Determines if a node contains a range | ||||||
| @@ -213,11 +201,11 @@ end | |||||||
| --- | --- | ||||||
| ---@return boolean True if the {node} contains the {range} | ---@return boolean True if the {node} contains the {range} | ||||||
| function M.node_contains(node, range) | function M.node_contains(node, range) | ||||||
|   local start_row, start_col, end_row, end_col = node:range() |   vim.validate({ | ||||||
|   local start_fits = start_row < range[1] or (start_row == range[1] and start_col <= range[2]) |     node = { node, 'userdata' }, | ||||||
|   local end_fits = end_row > range[3] or (end_row == range[3] and end_col >= range[4]) |     range = { range, Range.validate, 'integer list with 4 or 6 elements' }, | ||||||
|  |   }) | ||||||
|   return start_fits and end_fits |   return Range.contains({ node:range() }, range) | ||||||
| end | end | ||||||
|  |  | ||||||
| --- Returns a list of highlight captures at the given position | --- Returns a list of highlight captures at the given position | ||||||
|   | |||||||
| @@ -53,6 +53,26 @@ M.cmp_pos = { | |||||||
|  |  | ||||||
| setmetatable(M.cmp_pos, { __call = cmp_pos }) | setmetatable(M.cmp_pos, { __call = cmp_pos }) | ||||||
|  |  | ||||||
|  | ---@private | ||||||
|  | ---Check if a variable is a valid range object | ||||||
|  | ---@param r any | ||||||
|  | ---@return boolean | ||||||
|  | function M.validate(r) | ||||||
|  |   if type(r) ~= 'table' or #r ~= 6 and #r ~= 4 then | ||||||
|  |     return false | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   for _, e in | ||||||
|  |     ipairs(r --[[@as any[] ]]) | ||||||
|  |   do | ||||||
|  |     if type(e) ~= 'number' then | ||||||
|  |       return false | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   return true | ||||||
|  | end | ||||||
|  |  | ||||||
| ---@private | ---@private | ||||||
| ---@param r1 Range4|Range6 | ---@param r1 Range4|Range6 | ||||||
| ---@param r2 Range4|Range6 | ---@param r2 Range4|Range6 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lewis Russell
					Lewis Russell