]> git.eshelyaron.com Git - emacs.git/commitdiff
Make treesit-node-at more readable
authorYuan Fu <casouri@gmail.com>
Wed, 5 Feb 2025 07:35:37 +0000 (23:35 -0800)
committerEshel Yaron <me@eshelyaron.com>
Sun, 9 Feb 2025 08:40:52 +0000 (09:40 +0100)
* lisp/treesit.el (treesit-node-at): Make the logic for finding
the parser (and the root node) more explicit and
straightforward.  Don't use treesit-buffer-root-node; instead,
find the parser and use treesit-parser-root-node directly.

(cherry picked from commit 12a3145b3b9480e5e5993dac28df52a36cc7b95d)

lisp/treesit.el

index 81ca131769fef5a1271375876c85b1e6e240e788..d4ffb7188d889f9c92310c768df7b4636f7bddbb 100644 (file)
@@ -226,17 +226,35 @@ is nil, try to guess the language at POS using `treesit-language-at'.
 If there's a local parser at POS, the local parser takes priority
 unless PARSER-OR-LANG is a parser, or PARSER-OR-LANG is a
 language and doesn't match the language of the local parser."
-  (let* ((root (if (treesit-parser-p parser-or-lang)
-                   (treesit-parser-root-node parser-or-lang)
-                 (or (when-let ((parser
-                                 (car (treesit-local-parsers-at
-                                       pos parser-or-lang))))
-                       (treesit-parser-root-node parser))
-                     (condition-case nil
-                         (treesit-buffer-root-node
-                          (or parser-or-lang
-                              (treesit-language-at pos)))
-                       (treesit-no-parser nil)))))
+  (let* ((root
+          ;; 1. Given a parser, just use the parser's root node.
+          (cond ((treesit-parser-p parser-or-lang)
+                 (treesit-parser-root-node parser-or-lang))
+                ;; 2. Given a language, try local parser, then global
+                ;; parser.
+                (parser-or-lang
+                 (let* ((local-parser (car (treesit-local-parsers-at
+                                            pos parser-or-lang)))
+                        (global-parser (car (treesit-parser-list
+                                             nil parser-or-lang)))
+                        (parser (or local-parser global-parser)))
+                   (when parser
+                     (treesit-parser-root-node parser))))
+                ;; 3. No given language, try to get a language at point.
+                ;; If we got a language, only use parser of that
+                ;; language, otherwise use any parser we can find.  When
+                ;; finding parser, try local parser first, then global
+                ;; parser.
+                (t
+                 ;; LANG can be nil.
+                 (let* ((lang (treesit-language-at pos))
+                        (local-parser (car (treesit-local-parsers-at
+                                            pos lang)))
+                        (global-parser (car (treesit-parser-list
+                                             nil lang)))
+                        (parser (or local-parser global-parser)))
+                   (when parser
+                     (treesit-parser-root-node parser))))))
          (node root)
          (node-before root)
          (pos-1 (max (1- pos) (point-min)))