1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Fix tree-sitter fontification heuristic

Previously applied heuristic 2 sometimes invalidates heuristic 1, add
a guard so it doesn't.

The new function is just for clearity of the code and has nothing to
do with the change itself.

* lisp/treesit.el (treesit--node-length): New function
(treesit-font-lock-fontify-region): Use the new function.  Only do
heuristic 2 when the node is large.
This commit is contained in:
Yuan Fu 2022-11-20 20:29:53 -08:00
parent 3069849bd4
commit 938e68bb28
No known key found for this signature in database
GPG key ID: 56E19BC57664A442

View file

@ -779,6 +779,10 @@ range is between START and END."
;; If NODE has no child, keep NODE.
(or result node)))
(defsubst treesit--node-length (node)
"Return the length of the text of NODE."
(- (treesit-node-end node) (treesit-node-start node)))
;; Some details worth explaining:
;;
;; 1. When we apply face to a node, we clip the face into the
@ -817,19 +821,21 @@ If LOUDLY is non-nil, display some debugging information."
(activate (eq t enable)))
(ignore activate)
;; The node seems small, enlarge it.
(while (and (< (- (treesit-node-end node-on)
(treesit-node-start node-on))
40)
;; Heuristic 1: The node seems small, enlarge it.
(while (and (< (treesit--node-length node-on) 40)
(treesit-node-parent node-on))
(setq node-on (treesit-node-parent node-on)))
;; Maybe the node returned by `treesit-node-on' is the root
;; node, because the region between START and END contains
;; several top-level constructs (e.g., variable declarations
;; in C).
(setq node-on (treesit--children-covering-range
node-on start end))
;; Heuristic 2: Maybe the node returned by `treesit-node-on'
;; is the root node or some excessively large node, because
;; the region between START and END contains several top-level
;; constructs (e.g., variable declarations in C), try find a
;; list of children that spans the fontification range.
(if (> (treesit--node-length node-on)
(* 4 (max jit-lock-chunk-size (- end start))))
(setq node-on (treesit--children-covering-range
node-on start end))
(setq node-on (list node-on)))
(dolist (sub-node node-on)
(let ((captures (treesit-query-capture