From: Yuan Fu Date: Thu, 14 Sep 2023 02:16:04 +0000 (-0700) Subject: Fix treesit-font-lock-fontify-region wrt local parsers X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=63766b49e2a4a8c1b46446d0e97bfac640159610;p=emacs.git 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. --- 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