diff options
author | Quentin Rasmont <qrasmont@gmail.com> | 2022-04-30 10:43:26 +0200 |
---|---|---|
committer | bfredl <bjorn.linse@gmail.com> | 2022-08-25 18:01:14 +0200 |
commit | 6b2d42eb0352d01923e4bf2e3ce0824c662b7be4 (patch) | |
tree | dd04bf0932a50a89141d366e8ee56ff84f2aa0ff /runtime/lua/vim | |
parent | 733b2e12b86a34c00aa07e0491762f88582792a5 (diff) | |
download | rneovim-6b2d42eb0352d01923e4bf2e3ce0824c662b7be4.tar.gz rneovim-6b2d42eb0352d01923e4bf2e3ce0824c662b7be4.tar.bz2 rneovim-6b2d42eb0352d01923e4bf2e3ce0824c662b7be4.zip |
feat(treesitter): add ability to retreive a tree/node given a range
Diffstat (limited to 'runtime/lua/vim')
-rw-r--r-- | runtime/lua/vim/treesitter/languagetree.lua | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua index 4d3b0631a2..f87a66ddab 100644 --- a/runtime/lua/vim/treesitter/languagetree.lua +++ b/runtime/lua/vim/treesitter/languagetree.lua @@ -549,6 +549,44 @@ function LanguageTree:contains(range) return false end +--- Gets the tree that contains {range} +--- +---@param range table A text range +---@param opts table Options table +---@param opts.ignore_injections boolean (default true) Ignore injected languages. +function LanguageTree:tree_for_range(range, opts) + opts = opts or {} + local ignore = vim.F.if_nil(opts.ignore_injections, true) + + if not ignore then + for _, child in pairs(self._children) do + for _, tree in pairs(child:trees()) do + if tree_contains(tree, range) then + return tree + end + end + end + end + + for _, tree in pairs(self._trees) do + if tree_contains(tree, range) then + return tree + end + end + + return nil +end + +--- Gets the smallest named node that contains {range} +--- +---@param range table A text range +---@param opts table Options table +---@param opts.ignore_injections boolean (default true) Ignore injected languages. +function LanguageTree:named_node_for_range(range, opts) + local tree = self:tree_for_range(range, opts) + return tree:root():named_descendant_for_range(unpack(range)) +end + --- Gets the appropriate language that contains {range} --- ---@param range A text range, see |LanguageTree:contains| |