diff options
author | Riley Bruins <ribru17@hotmail.com> | 2024-09-25 11:33:14 -0700 |
---|---|---|
committer | Christian Clason <c.clason@uni-graz.at> | 2024-09-25 23:01:08 +0200 |
commit | 64847fbdc908bf0a301b8f1e1814ff71bd425bae (patch) | |
tree | 9b305dcfe6a3f0e41de042ca24fc7363f010d821 /test/functional/treesitter/utils_spec.lua | |
parent | 921dc22fc0909bd0fdec2ebf42bb39de26347944 (diff) | |
download | rneovim-64847fbdc908bf0a301b8f1e1814ff71bd425bae.tar.gz rneovim-64847fbdc908bf0a301b8f1e1814ff71bd425bae.tar.bz2 rneovim-64847fbdc908bf0a301b8f1e1814ff71bd425bae.zip |
perf(treesitter): use `child_containing_descendant()` in `is_ancestor()`
**Problem:** `is_ancestor()` uses a slow, bottom-up parent lookup which
has performance pitfalls detailed in #28512.
**Solution:** Take `is_ancestor()` from $O(n^2)$ to $O(n)$ by
incorporating the use of the `child_containing_descendant()` function
Diffstat (limited to 'test/functional/treesitter/utils_spec.lua')
-rw-r--r-- | test/functional/treesitter/utils_spec.lua | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/test/functional/treesitter/utils_spec.lua b/test/functional/treesitter/utils_spec.lua index e079a7c8e7..34bea349f6 100644 --- a/test/functional/treesitter/utils_spec.lua +++ b/test/functional/treesitter/utils_spec.lua @@ -21,12 +21,16 @@ describe('treesitter utils', function() local parser = vim.treesitter.get_parser(0, 'c') local tree = parser:parse()[1] local root = tree:root() - _G.ancestor = root:child(0) - _G.child = _G.ancestor:child(0) + _G.ancestor = assert(root:child(0)) + _G.child = assert(_G.ancestor:named_child(1)) + _G.child_sibling = assert(_G.ancestor:named_child(2)) + _G.grandchild = assert(_G.child:named_child(0)) end) eq(true, exec_lua('return vim.treesitter.is_ancestor(_G.ancestor, _G.child)')) + eq(true, exec_lua('return vim.treesitter.is_ancestor(_G.ancestor, _G.grandchild)')) eq(false, exec_lua('return vim.treesitter.is_ancestor(_G.child, _G.ancestor)')) + eq(false, exec_lua('return vim.treesitter.is_ancestor(_G.child, _G.child_sibling)')) end) it('can detect if a position is contained in a node', function() |