emacs-diffs
[Top][All Lists]
Advanced

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

feature/tree-sitter 69ab588bb5 3/3: Pass region start and end to tree-si


From: Yuan Fu
Subject: feature/tree-sitter 69ab588bb5 3/3: Pass region start and end to tree-sitter fontification functions
Date: Wed, 2 Nov 2022 20:23:02 -0400 (EDT)

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

    Pass region start and end to tree-sitter fontification functions
    
    * doc/lispref/modes.texi (Parser-based Font Lock): Update manual.
    * lisp/progmodes/js.el (js--fontify-template-string)
    * lisp/progmodes/python.el (python--treesit-fontify-string): Update
    function to only fontify within the region.
    * lisp/treesit.el (treesit-font-lock-rules): Update docstring.
    (treesit-font-lock-fontify-region): Pass START and END to
    fontification functions.
---
 doc/lispref/modes.texi   | 16 +++++++++-------
 lisp/progmodes/js.el     | 22 ++++++++++++----------
 lisp/progmodes/python.el | 12 +++++++-----
 lisp/treesit.el          | 19 +++++++++++++------
 4 files changed, 41 insertions(+), 28 deletions(-)

diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index c6f848ffb2..c1b092247b 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -3979,13 +3979,15 @@ with that face.
 
 @findex treesit-fontify-with-override
 Capture names can also be function names, in which case the function
-is called with 2 arguments: @var{node} and @var{override}, where
-@var{node} is the node itself, and @var{override} is the override
-property of the rule which captured this node.  (If this function
-wants to respect the @var{override} argument, it can use
-@code{treesit-fontify-with-override}.)  Beyond the 2 arguments
-presented, this function should accept more arguments as optional
-arguments for future extensibility.
+is called with 4 arguments: @var{node} and @var{override}, @var{start}
+and @var{end}, where @var{node} is the node itself, @var{override} is
+the override property of the rule which captured this node, and
+@var{start} and @var{end} limits the region in which this function
+should fontify.  (If this function wants to respect the @var{override}
+argument, it can use @code{treesit-fontify-with-override}.)
+
+Beyond the 4 arguments presented, this function should accept more
+arguments as optional arguments for future extensibility.
 
 If a capture name is both a face and a function, the face takes
 priority.  If a capture name is neither a face nor a function, it is
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 76d4ec748a..c77c0fb90b 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3573,9 +3573,10 @@ This function is intended for use in 
`after-change-functions'."
       @font-lock-constant-face)))
   "Tree-sitter font-lock settings.")
 
-(defun js--fontify-template-string (node override &rest _)
+(defun js--fontify-template-string (node override start end &rest _)
   "Fontify template string but not substitution inside it.
-BEG, END, NODE refers to the template_string node.
+NODE is the template_string node. START and END marks the region
+to be fontified.
 
 OVERRIDE is the override flag described in
 `treesit-font-lock-rules'."
@@ -3585,16 +3586,17 @@ OVERRIDE is the override flag described in
   ;; closing "`".  That's why we have to track BEG instead of just
   ;; fontifying each child.
   (let ((child (treesit-node-child node 0))
-        (beg (treesit-node-start node)))
+        (font-beg (treesit-node-start node)))
     (while child
-      (if (equal (treesit-node-type child) "template_substitution")
+      (let ((font-end (if (equal (treesit-node-type child)
+                                 "template_substitution")
+                          (treesit-node-start child)
+                        (treesit-node-end child))))
+        (setq font-beg (max beg font-beg))
+        (when (< font-beg end)
           (treesit-fontify-with-override
-           beg (treesit-node-start child)
-           'font-lock-string-face override)
-        (treesit-fontify-with-override
-         beg (treesit-node-end child)
-         'font-lock-string-face override))
-      (setq beg (treesit-node-end child)
+           font-beg font-end 'font-lock-string-face override)))
+      (setq font-beg (treesit-node-end child)
             child (treesit-node-next-sibling child)))))
 
 (defun js-treesit-current-defun ()
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 603cdb14e1..8db96b117f 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -1015,11 +1015,12 @@ It makes underscores and dots word constituent chars.")
     "VMSError" "WindowsError"
     ))
 
-(defun python--treesit-fontify-string (node override &rest _)
+(defun python--treesit-fontify-string (node override start end &rest _)
   "Fontify string.
-NODE is the leading quote in the string.  Do not fontify the initial
-f for f-strings.  OVERRIDE is the override flag described in
-`treesit-font-lock-rules'."
+NODE is the leading quote in the string.  Do not fontify the
+initial f for f-strings.  OVERRIDE is the override flag described
+in `treesit-font-lock-rules'.  START and END marks the region to
+be fontified."
   (let* ((string (treesit-node-parent node))
          (string-beg (treesit-node-start string))
          (string-end (treesit-node-end string))
@@ -1033,7 +1034,8 @@ f for f-strings.  OVERRIDE is the override flag described 
in
                  'font-lock-string-face)))
     (when (eq (char-after string-beg) ?f)
       (cl-incf string-beg))
-    (treesit-fontify-with-override string-beg string-end face override)))
+    (treesit-fontify-with-override
+     (max start string-beg) (min end string-end) face override)))
 
 (defvar python--treesit-settings
   (treesit-font-lock-rules
diff --git a/lisp/treesit.el b/lisp/treesit.el
index 6a7ba87e83..d6058cdc43 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -502,11 +502,18 @@ Other keywords include:
 
 Capture names in QUERY should be face names like
 `font-lock-keyword-face'.  The captured node will be fontified
-with that face.  Capture names can also be function names, in
-which case the function should have a signature (NODE OVERRIDE
-&rest _), where NODE is the tree-sitter node object, and OVERRIDE
-is the override option of that rule.  This function should accept
-more arguments as optional arguments for future extensibility.
+with that face.
+
+Capture names can also be function names, in which case the
+function should have a signature
+
+    (NODE OVERRIDE START END &rest _)
+
+where NODE is the tree-sitter node object, OVERRIDE is the
+override option of that rule, and START and END marks the region
+to be fontified.  This function should accept more arguments as
+optional arguments for future extensibility.  And this function
+shouldn't fontify text outside START and END.
 
 If a capture name is both a face and a function, the face takes
 priority.  If a capture name is not a face name nor a function
@@ -754,7 +761,7 @@ If LOUDLY is non-nil, display some debugging information."
                    (max node-start start) (min node-end end)
                    face override))
                  ((functionp face)
-                  (funcall face node override)))
+                  (funcall face node override start end)))
                 ;; Don't raise an error if FACE is neither a face nor
                 ;; a function.  This is to allow intermediate capture
                 ;; names used for #match and #eq.



reply via email to

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