neovim

Personal neovim configuration files
git clone git://gtms.dev/neovim
Log | Files | Refs

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