From: Yuan Fu Date: Mon, 3 Mar 2025 04:26:28 +0000 (-0800) Subject: Don't process function range settings in treesit--update-range-1 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=735cf4295fe27e0136c7f0cea096f954ed9d083f;p=emacs.git Don't process function range settings in treesit--update-range-1 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) --- diff --git a/lisp/treesit.el b/lisp/treesit.el index 8aa5d9b4b4a..6e08e9458f6 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -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))