emacs-diffs
[Top][All Lists]
Advanced

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

emacs-29 ec00d292ec0: Improve treesit-fontify-with-override


From: Yuan Fu
Subject: emacs-29 ec00d292ec0: Improve treesit-fontify-with-override
Date: Sun, 4 Dec 2022 23:03:38 -0500 (EST)

branch: emacs-29
commit ec00d292ec02f34a0d879767c6737fadbe24ce20
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    Improve treesit-fontify-with-override
    
    This also fixes fontification problem with c-ts-mode--fontify-defun.
    
    Now treesit-fontify-with-override clips the fontification region for
    the user, so no need for (max start node-start) shenanigans anymore.
    More importantly it doesn't fontify unless the region between
    node-start and node-end intersects with the region between start and
    end, which fixes the problem with c-ts-mode--fontify-defun.
    
    * lisp/treesit.el (treesit-fontify-with-override): Add optional
    parameter BOUND-START and BOUND-END.  Wrap the function body in a
    when-form.
    * lisp/progmodes/c-ts-mode.el (c-ts-mode--fontify-declarator)
    (c-ts-mode--fontify-variable)
    (c-ts-mode--fontify-defun)
    (c-ts-fontify-error)
    * lisp/progmodes/js.el (js--fontify-template-string)
    * lisp/progmodes/python.el (python--treesit-fontify-string): Use the
    new signature.
---
 lisp/progmodes/c-ts-mode.el | 28 +++++++++++-----------------
 lisp/progmodes/js.el        |  2 +-
 lisp/progmodes/python.el    |  2 +-
 lisp/treesit.el             | 42 ++++++++++++++++++++++++++----------------
 4 files changed, 39 insertions(+), 35 deletions(-)

diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index a8189a0f3da..1bd093cfa2d 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -360,12 +360,11 @@ For NODE, OVERRIDE, START, END, and ARGS, see
             override start end args))
     ((or "identifier" "field_identifier")
      (treesit-fontify-with-override
-      (max (treesit-node-start node) start)
-      (min (treesit-node-end node) end)
+      (treesit-node-start node) (treesit-node-end node)
       (pcase (treesit-node-type (treesit-node-parent node))
         ("function_declarator" 'font-lock-function-name-face)
         (_ 'font-lock-variable-name-face))
-      override))))
+      override start end))))
 
 (defun c-ts-mode--fontify-variable (node override start end &rest _)
   "Fontify an identifier node.
@@ -375,10 +374,8 @@ OVERRIDE, START, END, and ARGS, see 
`treesit-font-lock-rules'."
                      (treesit-node-parent node))
                     "call_expression"))
     (treesit-fontify-with-override
-     (max (treesit-node-start node) start)
-     (min (treesit-node-end node) end)
-     'font-lock-variable-name-face
-     override)))
+     (treesit-node-start node) (treesit-node-end node)
+     'font-lock-variable-name-face override start end)))
 
 (defun c-ts-mode--fontify-defun (node override start end &rest _)
   "Correctly fontify the DEFUN macro.
@@ -405,21 +402,19 @@ This function corrects the fontification on the colon in
       (when (equal (treesit-node-text node t) ":")
         (treesit-fontify-with-override
          (treesit-node-start node) (treesit-node-end node)
-         'default override)))
+         'default override start end)))
     ;; Fix the parameter list.
     (while arg-list-2
       (let ((type (and arg-list-2 (pop arg-list-2)))
             (arg (and arg-list-2 (pop arg-list-2))))
         (when type
           (treesit-fontify-with-override
-           (max start (treesit-node-start type))
-           (min end (treesit-node-end type))
-           'font-lock-type-face override))
+           (treesit-node-start type) (treesit-node-end type)
+           'font-lock-type-face override start end))
         (when arg
           (treesit-fontify-with-override
-           (max start (treesit-node-start arg))
-           (min end (treesit-node-end arg))
-           'default override))))))
+           (treesit-node-start arg) (treesit-node-end arg)
+           'default override start end))))))
 
 (defun c-ts-fontify-error (node override start end &rest _)
   "Fontify the error nodes.
@@ -428,8 +423,7 @@ For NODE, OVERRIDE, START, and END, see
   (let ((parent (treesit-node-parent node))
         (child (treesit-node-child node 0)))
     (treesit-fontify-with-override
-     (max start (treesit-node-start node))
-     (min end (treesit-node-end node))
+     (treesit-node-start node) (treesit-node-end node)
      (cond
       ;; This matches the case MACRO(struct a, b, c)
       ;; where struct is seen as error.
@@ -439,7 +433,7 @@ For NODE, OVERRIDE, START, and END, see
                     '("struct" "long" "short" "enum" "union")))
        'font-lock-keyword-face)
       (t 'font-lock-warning-face))
-     override)))
+     override start end)))
 
 (defun c-ts-mode--imenu-1 (node)
   "Helper for `c-ts-mode--imenu'.
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 389096147ac..90ab7cc924b 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3647,7 +3647,7 @@ OVERRIDE is the override flag described in
         (setq font-beg (max start font-beg))
         (when (< font-beg end)
           (treesit-fontify-with-override
-           font-beg font-end 'font-lock-string-face override)))
+           font-beg font-end 'font-lock-string-face override start end)))
       (setq font-beg (treesit-node-end child)
             child (treesit-node-next-sibling child)))))
 
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 4fc5d24e2fb..ebee703499a 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -1069,7 +1069,7 @@ fontified."
     (when (eq (char-after string-beg) ?f)
       (cl-incf string-beg))
     (treesit-fontify-with-override
-     (max start string-beg) (min end string-end) face override)))
+     string-beg string-end face override start end)))
 
 (defvar python--treesit-settings
   (treesit-font-lock-rules
diff --git a/lisp/treesit.el b/lisp/treesit.el
index f3c03daf7e0..eee6eee0c7f 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -774,25 +774,35 @@ signals the `treesit-font-lock-error' error if that 
happens."
                        ((memq feature remove-list) nil)
                        (t current-value))))))
 
-(defun treesit-fontify-with-override (start end face override)
+(defun treesit-fontify-with-override
+    (start end face override &optional bound-start bound-end)
   "Apply FACE to the region between START and END.
 OVERRIDE can be nil, t, `append', `prepend', or `keep'.
-See `treesit-font-lock-rules' for their semantic."
-  (pcase override
-    ('nil (unless (text-property-not-all
-                   start end 'face nil)
-            (put-text-property start end 'face face)))
-    ('t (put-text-property start end 'face face))
-    ('append (font-lock-append-text-property
+See `treesit-font-lock-rules' for their semantic.
+
+If BOUND-START and BOUND-END are non-nil, only fontify the region
+in between them."
+  (when (or (null bound-start) (null bound-end)
+            (and bound-start bound-end
+                 (<= bound-start end)
+                 (>= bound-end start)))
+    (when (and bound-start bound-end)
+      (setq start (max bound-start start)
+            end (min bound-end end)))
+    (pcase override
+      ('nil (unless (text-property-not-all start end 'face nil)
+              (put-text-property start end 'face face)))
+      ('t (put-text-property start end 'face face))
+      ('append (font-lock-append-text-property
+                start end 'face face))
+      ('prepend (font-lock-prepend-text-property
+                 start end 'face face))
+      ('keep (font-lock-fillin-text-property
               start end 'face face))
-    ('prepend (font-lock-prepend-text-property
-               start end 'face face))
-    ('keep (font-lock-fillin-text-property
-            start end 'face face))
-    (_ (signal 'treesit-font-lock-error
-               (list
-                "Unrecognized value of :override option"
-                override)))))
+      (_ (signal 'treesit-font-lock-error
+                 (list
+                  "Unrecognized value of :override option"
+                  override))))))
 
 (defun treesit--set-nonsticky (start end sym &optional remove)
   "Set `rear-nonsticky' property between START and END.



reply via email to

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