diff options
author | Jongwook Choi <wookayin@gmail.com> | 2024-02-01 15:34:35 -0500 |
---|---|---|
committer | Jongwook Choi <wookayin@gmail.com> | 2024-02-05 16:23:22 -0500 |
commit | a478bf936b2a648312704c02898eb7e5bfbf5692 (patch) | |
tree | 25b78296ba022f0d1cb4f9534a1291f5fed7666a /runtime/lua/vim/treesitter/dev.lua | |
parent | 0e9a33572dc752463a0f5ad8a08a2c494d7a42e1 (diff) | |
download | rneovim-a478bf936b2a648312704c02898eb7e5bfbf5692.tar.gz rneovim-a478bf936b2a648312704c02898eb7e5bfbf5692.tar.bz2 rneovim-a478bf936b2a648312704c02898eb7e5bfbf5692.zip |
feat(treesitter): use 0-based indexing to show ranges in `:InspectTree`
Problem:
- `:InspectTree` was showing node ranges in 1-based indexing, i.e., in
vim cursor position (lnum, col). However, treesitter API adopts
0-based indexing to represent ranges (Range4). This can often be
confusing for developers and plugin authors when debugging code
written with treesiter APIs.
Solution:
- Change to 0-based indexing from 1-based indexing to show node ranges
in `:InspectTree`.
- Note: To make things not complicated, we do not provide an option or
keymap to configure which indexing mode to use.
Diffstat (limited to 'runtime/lua/vim/treesitter/dev.lua')
-rw-r--r-- | runtime/lua/vim/treesitter/dev.lua | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/runtime/lua/vim/treesitter/dev.lua b/runtime/lua/vim/treesitter/dev.lua index 1385642acd..e1f93a654b 100644 --- a/runtime/lua/vim/treesitter/dev.lua +++ b/runtime/lua/vim/treesitter/dev.lua @@ -3,16 +3,20 @@ local api = vim.api ---@class TSDevModule local M = {} +---@private ---@class TSTreeView ---@field ns integer API namespace ----@field opts table Options table with the following keys: ---- - anon (boolean): If true, display anonymous nodes ---- - lang (boolean): If true, display the language alongside each node ---- - indent (number): Number of spaces to indent nested lines. Default is 2. +---@field opts TSTreeViewOpts ---@field nodes TSP.Node[] ---@field named TSP.Node[] local TSTreeView = {} +---@private +---@class TSTreeViewOpts +---@field anon boolean If true, display anonymous nodes. +---@field lang boolean If true, display the language alongside each node. +---@field indent number Number of spaces to indent nested lines. + ---@class TSP.Node ---@field node TSNode Treesitter node ---@field field string? Node field @@ -115,6 +119,7 @@ function TSTreeView:new(bufnr, lang) ns = api.nvim_create_namespace('treesitter/dev-inspect'), nodes = nodes, named = named, + ---@type TSTreeViewOpts opts = { anon = false, lang = false, @@ -129,16 +134,12 @@ end local decor_ns = api.nvim_create_namespace('ts.dev') ----@param lnum integer ----@param col integer ----@param end_lnum integer ----@param end_col integer +---@param range Range4 ---@return string -local function get_range_str(lnum, col, end_lnum, end_col) - if lnum == end_lnum then - return string.format('[%d:%d - %d]', lnum + 1, col + 1, end_col) - end - return string.format('[%d:%d - %d:%d]', lnum + 1, col + 1, end_lnum + 1, end_col) +local function range_to_string(range) + ---@type integer, integer, integer, integer + local row, col, end_row, end_col = unpack(range) + return string.format('[%d, %d] - [%d, %d]', row, col, end_row, end_col) end ---@param w integer @@ -212,7 +213,7 @@ function TSTreeView:draw(bufnr) local lang_hl_marks = {} ---@type table[] for i, item in self:iter() do - local range_str = get_range_str(item.node:range()) + local range_str = range_to_string({ item.node:range() }) local lang_str = self.opts.lang and string.format(' %s', item.lang) or '' local text ---@type string |