]> git.eshelyaron.com Git - emacs.git/commitdiff
Pass region start and end to tree-sitter fontification functions
authorYuan Fu <casouri@gmail.com>
Thu, 3 Nov 2022 00:03:03 +0000 (17:03 -0700)
committerYuan Fu <casouri@gmail.com>
Thu, 3 Nov 2022 00:03:03 +0000 (17:03 -0700)
* 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
lisp/progmodes/js.el
lisp/progmodes/python.el
lisp/treesit.el

index c6f848ffb2359c59112294d76a7b11c9df188939..c1b092247bd13322738f1a98acf58dcc6a528fa4 100644 (file)
@@ -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
index 76d4ec748a074a9c8a74c9e54c6ccb960d72b8d0..c77c0fb90bedcc314ccb4592d49bf434665e8747 100644 (file)
@@ -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 ()
index 603cdb14e15207c81fe766e136f29cac447445ee..8db96b117f31348819aa89b06b89a17ff84c8a6d 100644 (file)
@@ -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
index 6a7ba87e836bca4a8f53c648b20e89aba68c62e1..d6058cdc43f16f37c40bb191154a4305dc91f2e8 100644 (file)
@@ -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.