aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
authorThomas Vigouroux <tomvig38@gmail.com>2020-04-20 09:24:48 +0200
committerThomas Vigouroux <tomvig38@gmail.com>2020-04-20 22:22:33 +0200
commit30b34fa505e95030697e2d03c7e5442d93c8ac0c (patch)
treec0fda71eca8095cbf65a3916222cca81587486e6 /lua
parentMerge pull request #3 from vigoux/feature/locals (diff)
downloadnvim-treesitter-30b34fa505e95030697e2d03c7e5442d93c8ac0c.tar
nvim-treesitter-30b34fa505e95030697e2d03c7e5442d93c8ac0c.tar.gz
nvim-treesitter-30b34fa505e95030697e2d03c7e5442d93c8ac0c.tar.bz2
nvim-treesitter-30b34fa505e95030697e2d03c7e5442d93c8ac0c.tar.lz
nvim-treesitter-30b34fa505e95030697e2d03c7e5442d93c8ac0c.tar.xz
nvim-treesitter-30b34fa505e95030697e2d03c7e5442d93c8ac0c.tar.zst
nvim-treesitter-30b34fa505e95030697e2d03c7e5442d93c8ac0c.zip
feat: add node manipulation utils
Diffstat (limited to 'lua')
-rw-r--r--lua/nvim-treesitter/utils.lua66
1 files changed, 66 insertions, 0 deletions
diff --git a/lua/nvim-treesitter/utils.lua b/lua/nvim-treesitter/utils.lua
new file mode 100644
index 000000000..8313a46a7
--- /dev/null
+++ b/lua/nvim-treesitter/utils.lua
@@ -0,0 +1,66 @@
+-- Utils collection for nvim-treesitter
+local api = vim.api
+local parsers = require'nvim-treesitter.parsers'
+
+local M = {}
+
+--- Gets the smallest expression containing the current cursor position
+function M.expression_at_point(bufnr, lang)
+ local bufnr = bufnr or api.nvim_get_current_buf()
+ local lang = lang or api.nvim_buf_get_option(bufnr, 'ft')
+
+ local parser = parsers.get_parser(bufnr, lang)
+ if not parser then return end
+
+ local tsroot = parser:parse():root()
+ if not tsroot then return end
+
+ local curwin = api.nvim_get_current_win()
+
+ if api.nvim_win_get_buf(curwin) == bufnr then
+ local cursor = vim.api.nvim_win_get_cursor(curwin)
+ local current_node = tsroot:named_descendant_for_range(cursor[1] - 1, cursor[2], cursor[1] - 1, cursor[2])
+ return current_node
+ end
+end
+
+--- Gets the actual text content of a node
+-- @param node the node to get the text from
+-- @param bufnr the buffer containing the node
+-- @return list of lines of text of the node
+function M.get_node_text(node, bufnr)
+ local bufnr = bufnr or api.nvim_get_current_buf()
+ if not node then return {} end
+
+ -- We have to remember that end_col is end-exclusive
+ local start_row, start_col, end_row, end_col = node:range()
+ if start_row ~= end_row then
+ local lines = api.nvim_buf_get_lines(bufnr, start_row, end_row+1, false)
+ lines[1] = string.sub(lines[1], start_col+1)
+ lines[#lines] = string.sub(lines[#lines], 1, end_col)
+ return lines
+ else
+ local line = api.nvim_buf_get_lines(bufnr, start_row, start_row+1, true)[1]
+ return { string.sub(line, start_col+1, end_col) }
+ end
+end
+
+--- Determines wether a node is the parent of another
+-- @param dest the possible parent
+-- @param source the possible child node
+function M.is_parent(dest, source)
+ if not (dest and source) then return false end
+
+ local current = source
+ while current ~= nil do
+ if current == dest then
+ return true
+ end
+
+ current = current:parent()
+ end
+
+ return false
+end
+
+return M