emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/tree-sitter 1bb7b43e1c 4/5: Make treesit-node-at faster


From: Yuan Fu
Subject: feature/tree-sitter 1bb7b43e1c 4/5: Make treesit-node-at faster
Date: Mon, 10 Oct 2022 17:09:43 -0400 (EDT)

branch: feature/tree-sitter
commit 1bb7b43e1cfb911737bc4807671910238277470f
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    Make treesit-node-at faster
    
    * lisp/treesit.el (treesit-node-at): We only need to use
    treesit-node-first-child-for-pos.  This is both faster for large
    buffers and simpler.  Also remove the TODO comment.
---
 lisp/treesit.el | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/lisp/treesit.el b/lisp/treesit.el
index b51236b95e..1e911df1d9 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -115,19 +115,17 @@ greater or larger than POINT.  Return nil if none find.  
If NAMED
 non-nil, only look for named node.
 
 If PARSER-OR-LANG is nil, use the first parser in
-(`treesit-parser-list'); if PARSER-OR-LANG is a parser, use
+\(`treesit-parser-list'); if PARSER-OR-LANG is a parser, use
 that parser; if PARSER-OR-LANG is a language, find a parser using
 that language in the current buffer, and use that."
   (let ((node (if (treesit-parser-p parser-or-lang)
                   (treesit-parser-root-node parser-or-lang)
-                (treesit-buffer-root-node parser-or-lang))))
-    ;; TODO: We might want a `treesit-node-descendant-for-pos' in C.
-    (while (cond ((and node (< (treesit-node-end node) point))
-                  (setq node (treesit-node-next-sibling node))
-                  t)
-                 ((treesit-node-child node 0 named)
-                  (setq node (treesit-node-child node 0 named))
-                  t)))
+                (treesit-buffer-root-node parser-or-lang)))
+        next)
+    ;; This is very fast so no need for C implementation.
+    (while (setq next (treesit-node-first-child-for-pos
+                       node point named))
+      (setq node next))
     node))
 
 (defun treesit-node-on (beg end &optional parser-or-lang named)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]