aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/treesitter.lua
diff options
context:
space:
mode:
authorRiley Bruins <ribru17@hotmail.com>2024-09-25 11:33:14 -0700
committerChristian Clason <c.clason@uni-graz.at>2024-09-25 23:01:08 +0200
commit64847fbdc908bf0a301b8f1e1814ff71bd425bae (patch)
tree9b305dcfe6a3f0e41de042ca24fc7363f010d821 /runtime/lua/vim/treesitter.lua
parent921dc22fc0909bd0fdec2ebf42bb39de26347944 (diff)
downloadrneovim-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 'runtime/lua/vim/treesitter.lua')
-rw-r--r--runtime/lua/vim/treesitter.lua12
1 files changed, 2 insertions, 10 deletions
diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua
index 809ea59b94..baf47482a8 100644
--- a/runtime/lua/vim/treesitter.lua
+++ b/runtime/lua/vim/treesitter.lua
@@ -159,16 +159,8 @@ function M.is_ancestor(dest, source)
return false
end
- local current = source ---@type TSNode?
- while current ~= nil do
- if current == dest then
- return true
- end
-
- current = current:parent()
- end
-
- return false
+ -- child_containing_descendant returns nil if dest is a direct parent
+ return source:parent() == dest or dest:child_containing_descendant(source) ~= nil
end
--- Returns the node's range or an unpacked range table