[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