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.
This commit is contained in:
Yuan Fu 2023-09-13 19:16:04 -07:00
parent 921c0a16ce
commit 63766b49e2
No known key found for this signature in database
GPG key ID: 56E19BC57664A442

View file

@ -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