emacs-diffs
[Top][All Lists]
Advanced

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

feature/tree-sitter d1ef0243eb 2/2: Add emacs-devel-specific font-lock r


From: Yuan Fu
Subject: feature/tree-sitter d1ef0243eb 2/2: Add emacs-devel-specific font-lock rules to c-ts-mode
Date: Tue, 15 Nov 2022 13:21:21 -0500 (EST)

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

    Add emacs-devel-specific font-lock rules to c-ts-mode
    
    This rule corrects the fontification for DEFUN macros.
    
    * lisp/progmodes/c-ts-mode.el (c-ts-mode--font-lock-settings):
    Additional font-lock rules.
    (c-ts-mode--fontify-defun): New function.
---
 lisp/progmodes/c-ts-mode.el | 49 ++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 48 insertions(+), 1 deletion(-)

diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index 8d18c23da9..950ef1f65e 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -332,7 +332,54 @@ MODE is either `c' or `cpp'."
    :language mode
    :override t
    :feature 'error
-   '((ERROR) @font-lock-warning-face)))
+   '((ERROR) @font-lock-warning-face)
+   :language mode
+   :feature 'emacs-devel
+   :override 't
+   '(((call_expression function: (identifier) @fn)
+      @c-ts-mode--fontify-defun
+      (:match "^DEFUN$" @fn)))))
+
+(defun c-ts-mode--fontify-defun (node override start end &rest _)
+  "Correctly fontify the DEFUN macro.
+For NODE, OVERRIDE, START, and END, see
+`treesit-font-lock-rules'.  The captured NODE is a
+call_expression where DEFUN is the function.
+
+This function corrects the fontification on the colon in
+\"doc:\", and the parameter list."
+  (let* ((parent (treesit-node-parent node))
+         ;; ARG-LIST-1 and 2 are like this:
+         ;;
+         ;; DEFUN (ARG-LIST-1)
+         ;; (ARG-LIST-2)
+         (arg-list-1 (treesit-node-children
+                      (treesit-node-child-by-field-name
+                       node "arguments")))
+         ;; ARG-LIST-2 is the
+         (arg-list-2 (treesit-node-children
+                      (treesit-node-child-by-field-name
+                       parent "arguments") t)))
+    ;; Fix the colon.
+    (dolist (node arg-list-1)
+      (when (equal (treesit-node-text node t) ":")
+        (treesit-fontify-with-override
+         (treesit-node-start node) (treesit-node-end node)
+         'default override)))
+    ;; 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 t))
+        (when arg
+          (treesit-fontify-with-override
+           (max start(treesit-node-start arg))
+           (min end (treesit-node-end arg))
+           'default t))))))
 
 (defun c-ts-mode--imenu-1 (node)
   "Helper for `c-ts-mode--imenu'.



reply via email to

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