]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't process function range settings in treesit--update-range-1
authorYuan Fu <casouri@gmail.com>
Mon, 3 Mar 2025 04:26:28 +0000 (20:26 -0800)
committerEshel Yaron <me@eshelyaron.com>
Tue, 4 Mar 2025 21:03:31 +0000 (22:03 +0100)
This fixes a bug where we call treesit-query-language on a
function, which happens before the QUERY in a range setting can
be either a function or a query, but we call it with
treesit-query-language before knowing whether it's a query or
function.

* lisp/treesit.el:
(treesit--update-range-1): Skip function range settings.
(treesit-update-ranges): Handle function range settings here.

(cherry picked from commit a211a940a1e085d53172ceddf6bfc2391985e861)

lisp/treesit.el

index 8aa5d9b4b4ad8eb6cab00f0e083e3a199fe98292..6e08e9458f67ac4c620875185a4ff002bb451fb8 100644 (file)
@@ -1058,7 +1058,9 @@ embedded language parsers.
 EMBED-LEVEL is the embed level for the embedded parser being created or
 updated.  When looking for existing embedded parsers, only look for
 parsers of this level; when creating new parsers, set their level to
-this level."
+this level.
+
+Function range settings in SETTINGS are ignored."
   (let ((touched-parsers nil)
         (modified-tick (buffer-chars-modified-tick)))
     (dolist (setting settings)
@@ -1070,7 +1072,9 @@ this level."
              (range-fn (nth 4 setting)))
         (when (eq query-lang (treesit-parser-language host-parser))
           (cond
-           ((functionp query) (funcall query beg end))
+           ;; Function range settings don't participate in the recursive
+           ;; update, they're handled by `treesit--update-range'.
+           ((functionp query) nil)
            (local
             (setq touched-parsers
                   (append touched-parsers
@@ -1099,6 +1103,11 @@ region."
         (end (or end (point-max)))
         (host-parsers (list treesit-primary-parser))
         (embed-level 0))
+    ;; Handle function range settings here once. They don't participate
+    ;; in the recursive update below.
+    (dolist (setting treesit-range-settings)
+      (when (functionp (car setting))
+        (funcall (car setting) beg end)))
     (while (and host-parsers (< embed-level 4))
       (cl-incf embed-level)
       (let ((next-round-of-host-parsers nil))