]> git.eshelyaron.com Git - emacs.git/commitdiff
Make treesit-node-at faster
authorYuan Fu <casouri@gmail.com>
Mon, 10 Oct 2022 18:56:12 +0000 (11:56 -0700)
committerYuan Fu <casouri@gmail.com>
Mon, 10 Oct 2022 18:57:24 +0000 (11:57 -0700)
* 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

index b51236b95e9c4edfb56fc9db8e119b67f7bfde9d..1e911df1d96f459ebd11e0bd1b17b129f693e180 100644 (file)
@@ -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)