11local PythonTreeSitterNodes = {}
22
33-- part of the code from polarmutex/contextprint.nvim
4- local ts_utils = require (" nvim-treesitter.ts_utils" )
5- local ts_query = require (" nvim-treesitter.query" )
6- local parsers = require (" nvim-treesitter.parsers" )
7- local locals = require (" nvim-treesitter.locals" )
8- -- local vim_query = require("vim.treesitter.query")
94local api = vim .api
105local fn = vim .fn
116local get_node_text = vim .treesitter .get_node_text
127local parse = vim .treesitter .query .parse
13- if parse == nil then
14- parse = vim .treesitter .query .parse_query
8+
9+ -- Helper function to convert 0-indexed treesitter range to 1-indexed vim range
10+ local function get_vim_range (node )
11+ local start_row , start_col , end_row , end_col = node :range ()
12+ return start_row + 1 , start_col + 1 , end_row + 1 , end_col + 1
13+ end
14+
15+ -- Helper function to recurse through match captures (replaces locals.recurse_local_nodes)
16+ local function recurse_captures (match , query , callback )
17+ for id , node in pairs (match ) do
18+ local name = query .captures [id ]
19+ if name then
20+ callback (id , node , name )
21+ end
22+ end
1523end
1624
1725PythonTreeSitterNodes .count_parents = function (node )
@@ -54,21 +62,19 @@ PythonTreeSitterNodes.get_nodes = function(query, lang, defaults, bufnr)
5462 return nil
5563 end
5664
57- local parser = parsers .get_parser (bufnr , lang )
65+ local parser = vim . treesitter .get_parser (bufnr , lang )
5866 local root = parser :parse ()[1 ]:root ()
5967 local start_row , _ , end_row , _ = root :range ()
6068 local results = {}
61- for match in ts_query . iter_prepared_matches ( parsed_query , root , bufnr , start_row , end_row ) do
69+ for pattern , match , metadata in parsed_query : iter_matches ( root , bufnr , start_row , end_row ) do
6270 local sRow , sCol , eRow , eCol
6371 local declaration_node
6472 local type = " nil"
6573 local name = " nil"
66- locals . recurse_local_nodes (match , function (_ , node , path )
74+ recurse_captures (match , parsed_query , function (_ , node , path )
6775 local idx = string.find (path , " ." , 1 , true )
6876 local op = string.sub (path , idx + 1 , # path )
6977
70- -- local a1, b1, c1, d1 = vim.treesitter.get_node_range(node)
71-
7278 type = string.sub (path , 1 , idx - 1 )
7379 if name == nil then
7480 name = defaults [type ] or " empty"
@@ -78,11 +84,7 @@ PythonTreeSitterNodes.get_nodes = function(query, lang, defaults, bufnr)
7884 name = get_node_text (node , bufnr )
7985 elseif op == " declaration" then
8086 declaration_node = node
81- sRow , sCol , eRow , eCol = node :range ()
82- sRow = sRow + 1
83- eRow = eRow + 1
84- sCol = sCol + 1
85- eCol = eCol + 1
87+ sRow , sCol , eRow , eCol = get_vim_range (node )
8688 end
8789 end )
8890
@@ -124,12 +126,12 @@ PythonTreeSitterNodes.get_all_nodes = function(query, lang, defaults, bufnr, pos
124126 return nil
125127 end
126128
127- local parser = parsers .get_parser (bufnr , lang )
129+ local parser = vim . treesitter .get_parser (bufnr , lang )
128130 local root = parser :parse ()[1 ]:root ()
129131 local start_row , _ , end_row , _ = root :range ()
130132 local results = {}
131133 local node_type
132- for match in ts_query . iter_prepared_matches ( parsed_query , root , bufnr , start_row , end_row ) do
134+ for pattern , match , metadata in parsed_query : iter_matches ( root , bufnr , start_row , end_row ) do
133135 local sRow , sCol , eRow , eCol
134136 local declaration_node
135137 local type_node
@@ -139,14 +141,13 @@ PythonTreeSitterNodes.get_all_nodes = function(query, lang, defaults, bufnr, pos
139141 -- local method_receiver = ""
140142 -- ulog(match)
141143
142- locals . recurse_local_nodes (match , function (_ , node , path )
144+ recurse_captures (match , parsed_query , function (_ , node , path )
143145 -- local idx = string.find(path, ".", 1, true)
144146 -- The query may return multiple nodes, e.g.
145147 -- (type_declaration (type_spec name:(type_identifier)@type_decl.name type:(type_identifier)@type_decl.type))@type_decl.declaration
146148 -- returns { { @type_decl.name, @type_decl.type, @type_decl.declaration} ... }
147149 local idx = string.find (path , " .[^.]*$" ) -- find last `.`
148150 op = string.sub (path , idx + 1 , # path )
149- local a1 , b1 , c1 , d1 = vim .treesitter .get_node_range (node )
150151 local dbg_txt = get_node_text (node , bufnr ) or " "
151152 if # dbg_txt > 100 then
152153 dbg_txt = string.sub (dbg_txt , 1 , 100 ) .. " ..."
@@ -172,8 +173,7 @@ PythonTreeSitterNodes.get_all_nodes = function(query, lang, defaults, bufnr, pos
172173 type_node = node
173174 elseif op == ' declaration' or op == ' clause' then
174175 declaration_node = node
175- sRow , sCol , eRow , eCol =
176- ts_utils .get_vim_range ({ vim .treesitter .get_node_range (node ) }, bufnr )
176+ sRow , sCol , eRow , eCol = get_vim_range (node )
177177 else
178178 -- ulog('unknown op: ' .. op)
179179 end
@@ -194,7 +194,7 @@ PythonTreeSitterNodes.get_all_nodes = function(query, lang, defaults, bufnr, pos
194194 end
195195 if type_node ~= nil and ntype then
196196 -- ulog('type_only')
197- sRow , sCol , eRow , eCol = ts_utils . get_vim_range ({ vim . treesitter . get_node_range ( type_node ) }, bufnr )
197+ sRow , sCol , eRow , eCol = get_vim_range (type_node )
198198 table.insert (results , {
199199 type_node = type_node ,
200200 dim = { s = { r = sRow , c = sCol }, e = { r = eRow , c = eCol } },
@@ -266,7 +266,7 @@ PythonTreeSitterNodes.nodes_at_cursor = function(query, default, bufnr, ntype)
266266end
267267
268268function PythonTreeSitterNodes .inside_function ()
269- local current_node = ts_utils . get_node_at_cursor ()
269+ local current_node = vim . treesitter . get_node ()
270270 if not current_node then
271271 return false
272272 end
0 commit comments