debug.lua (3306B)
1 local parsers = require 'nvim-treesitter.parsers' 2 local tsu = require 'nvim-treesitter.ts_utils' 3 local api = vim.api 4 5 local M = {} 6 7 M.getNameFromBody = function(node) 8 if (node:type():find('function_body')) then 9 local previous = tsu.get_previous_node(node) 10 if previous:type() == 'method_signature' then 11 previous = previous:child() 12 for i, v in previous:iter_children() do if v == 'name' then return tsu.get_node_text(i)[1] or nil end end 13 elseif previous:type() == 'function_signature' then 14 for i, v in previous:iter_children() do if v == 'name' then return tsu.get_node_text(i)[1] or nil end end 15 end 16 end 17 end 18 19 M.getNameForClassDef = function(node) 20 if node:type() == 'class_definition' then 21 for no, na in node:iter_children() do if na == 'name' then return tsu.get_node_text(no)[1] or nil end end 22 end 23 end 24 25 local function iter_tree(node, work, level) 26 level = level or 1 27 for n in node:iter_children() do 28 work(n, level) 29 if n:child_count() > 0 then iter_tree(n, work, level + 1) end 30 end 31 end 32 33 M.getMethodName = function(n) 34 local node = n or tsu.get_node_at_cursor() 35 while node do 36 if (node:type():find('function_body')) then return M.getNameFromBody(node) end 37 node = node:parent() 38 end 39 end 40 41 -- Get map of names in tree for position of [node] 42 M.treeFor = function(node) 43 node = node or tsu.get_node_at_cursor() 44 local out = {} 45 while node do 46 if node:type() == 'function_body' then 47 local name = M.getNameFromBody(node) 48 table.insert(out, name) 49 elseif node:type() == 'class_definition' then 50 table.insert(out, M.getNameForClassDef(node)) 51 end 52 node = node:parent() 53 end 54 local reverse_out = {} 55 for i = #out, 1, -1 do table.insert(reverse_out, out[i]) end 56 return reverse_out 57 end 58 59 local Region = {} 60 Region.__index = Region 61 function Region:from_lsp_range(lsp_range, bufnr) 62 bufnr = bufnr or vim.fn.bufnr() 63 return setmetatable({ 64 bufnr = vim.fn.bufnr(bufnr), 65 start_row = lsp_range.start.line + 1, 66 start_col = lsp_range.start.character, 67 end_row = lsp_range['end'].line + 1, 68 end_col = lsp_range['end'].character, 69 }, self) 70 end 71 function Region:to_lsp_range() 72 return { 73 ['start'] = {line = self.start_row - 1, character = self.start_col}, 74 ['end'] = {line = self.end_row - 1, character = self.end_col}, 75 } 76 end 77 function Region:to_lsp_text_edit(text) return {range = self:to_lsp_range(), newText = text} end 78 79 -- Add print with tree location inside this class 80 M.print = function() 81 local tree = M.treeFor() 82 local bufnr = api.nvim_get_current_buf() 83 local r = Region:from_lsp_range(vim.lsp.util.make_range_params().range, bufnr) 84 local string = string.format('print(\'%s\');\n', table.concat(tree, '.')) 85 vim.lsp.util.apply_text_edits({r:to_lsp_text_edit(string)}, bufnr) 86 api.nvim_feedkeys('==', 'n', false) 87 end 88 89 -- Add print to every method in file 90 M.func = function() 91 local root = parsers.get_tree_root() 92 iter_tree(root, function(node, level) 93 local node_type = node:type() 94 if node_type == 'function_body' then 95 api.nvim_buf_set_lines(0, node:start() + 1, node:start() + 1, true, 96 {string.format('print("%s");', string.rep(' ', level), M.getMethodName(node))}) 97 api.nvim_feedkeys('==', 'n', false) 98 end 99 end) 100 end 101 102 return M