emacs-diffs
[Top][All Lists]
Advanced

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

master 63766b49e2a 1/3: Fix treesit-font-lock-fontify-region wrt local p


From: Yuan Fu
Subject: master 63766b49e2a 1/3: Fix treesit-font-lock-fontify-region wrt local parsers
Date: Thu, 14 Sep 2023 00:07:53 -0400 (EDT)

branch: master
commit 63766b49e2a4a8c1b46446d0e97bfac640159610
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    Fix treesit-font-lock-fontify-region wrt local parsers
    
    * lisp/treesit.el (treesit--update-ranges-local): Minor change.
    (treesit-font-lock-fontify-region): Don't try to fontify if node is
    nil.  Don't use alist-get to get the root node for a language: there
    might be multiple root nodes (from multiple local parsers) for the
    same language.
    (treesit-major-mode-setup): Remove existing local parsers when major
    mode is activated.
---
 lisp/treesit.el | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/lisp/treesit.el b/lisp/treesit.el
index 520fff04f80..94b534e4c84 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -650,7 +650,7 @@ parser for EMBEDDED-LANG."
         (dolist (ov (overlays-in beg end))
           ;; Update range of local parser.
           (let ((embedded-parser (overlay-get ov 'treesit-parser)))
-            (when (and embedded-parser
+            (when (and (treesit-parser-p embedded-parser)
                        (eq (treesit-parser-language embedded-parser)
                            embedded-lang))
               (treesit-parser-set-included-ranges
@@ -1149,16 +1149,17 @@ If LOUDLY is non-nil, display some debugging 
information."
   (let* ((local-parsers (treesit-local-parsers-on start end))
          (global-parsers (treesit-parser-list))
          (root-nodes
-          (mapcar (lambda (parser)
-                    (cons (treesit-parser-language parser)
-                          (treesit-parser-root-node parser)))
+          (mapcar #'treesit-parser-root-node
                   (append local-parsers global-parsers))))
     (dolist (setting treesit-font-lock-settings)
       (let* ((query (nth 0 setting))
              (enable (nth 1 setting))
              (override (nth 3 setting))
              (language (treesit-query-language query))
-             (root (alist-get language root-nodes)))
+             (root-nodes (cl-remove-if-not
+                          (lambda (node)
+                            (eq (treesit-node-language node) language))
+                          root-nodes)))
 
         ;; Use deterministic way to decide whether to turn on "fast
         ;; mode". (See bug#60691, bug#60223.)
@@ -1171,11 +1172,15 @@ If LOUDLY is non-nil, display some debugging 
information."
               (setq treesit--font-lock-fast-mode nil))))
 
         ;; Only activate if ENABLE flag is t.
-        (when-let ((activate (eq t enable))
-                   (nodes (if (eq t treesit--font-lock-fast-mode)
-                              (treesit--children-covering-range-recurse
-                               root start end (* 4 jit-lock-chunk-size))
-                            (list root))))
+        (when-let
+            ((activate (eq t enable))
+             (nodes (if (eq t treesit--font-lock-fast-mode)
+                        (mapcan
+                         (lambda (node)
+                           (treesit--children-covering-range-recurse
+                            node start end (* 4 jit-lock-chunk-size)))
+                         root-nodes)
+                      root-nodes)))
           (ignore activate)
 
           ;; Query each node.
@@ -2724,7 +2729,13 @@ before calling this function."
   ;; Imenu.
   (when treesit-simple-imenu-settings
     (setq-local imenu-create-index-function
-                #'treesit-simple-imenu)))
+                #'treesit-simple-imenu))
+
+  ;; Remove existing local parsers.
+  (dolist (ov (overlays-in (point-min) (point-max)))
+    (when-let ((parser (overlay-get ov 'treesit-parser)))
+      (treesit-parser-delete parser)
+      (delete-overlay ov))))
 
 ;;; Debugging
 



reply via email to

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