emacs-diffs
[Top][All Lists]
Advanced

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

feature/tree-sitter 938e68bb28 1/5: Fix tree-sitter fontification heuris


From: Yuan Fu
Subject: feature/tree-sitter 938e68bb28 1/5: Fix tree-sitter fontification heuristic
Date: Mon, 21 Nov 2022 04:42:05 -0500 (EST)

branch: feature/tree-sitter
commit 938e68bb280c96eaf163bd932ab2582fbe27e780
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    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.
---
 lisp/treesit.el | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/lisp/treesit.el b/lisp/treesit.el
index f9f807947c..7af64b4392 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -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



reply via email to

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