;; will set up Emacs to use the C/C++ modes defined here for other
;; files, provided that you have the corresponding parser grammar
;; libraries installed.
+;;
+;; If the tree-sitter doxygen grammar is available, then the comment
+;; blocks will be highlighted according to this grammar.
;;; Code:
;;; Font-lock
(defvar c-ts-mode--feature-list
- '(( comment definition)
+ '(( comment document definition)
( keyword preprocessor string type)
( assignment constant escape-sequence label literal)
( bracket delimiter error function operator property variable))
"LIVE_BUFFER" "FRAME"))
"A regexp matching all the variants of the FOR_EACH_* macro.")
+(defvar c-ts-mode--doxygen-comment-regex
+ (rx (| "/**" "/*!" "//!" "///"))
+ "A regexp that matches all doxygen comment styles.")
+
(defun c-ts-mode--font-lock-settings (mode)
"Tree-sitter font-lock settings.
MODE is either `c' or `cpp'."
(when c-ts-mode-emacs-sources-support
(treesit-parser-create 'c nil nil 'for-each))
- (treesit-parser-create 'c)
- ;; Comments.
- (setq-local comment-start "/* ")
- (setq-local comment-end " */")
- ;; Indent.
- (setq-local treesit-simple-indent-rules
- (c-ts-mode--get-indent-style 'c))
- ;; Font-lock.
- (setq-local treesit-font-lock-settings (c-ts-mode--font-lock-settings 'c))
- ;; Navigation.
- (setq-local treesit-defun-tactic 'top-level)
- (treesit-major-mode-setup)
-
- ;; Emacs source support: handle DEFUN and FOR_EACH_* gracefully.
- (when c-ts-mode-emacs-sources-support
- (setq-local add-log-current-defun-function
- #'c-ts-mode--emacs-current-defun-name)
-
- (setq-local treesit-range-settings
- (treesit-range-rules 'c-ts-mode--emacs-set-ranges))
-
- (setq-local treesit-language-at-point-function
- (lambda (_pos) 'c))
- (treesit-font-lock-recompute-features '(emacs-devel)))))
+ (let ((primary-parser (treesit-parser-create 'c)))
+ ;; Comments.
+ (setq-local comment-start "/* ")
+ (setq-local comment-end " */")
+ ;; Indent.
+ (setq-local treesit-simple-indent-rules
+ (c-ts-mode--get-indent-style 'c))
+ ;; Font-lock.
+ (setq-local treesit-font-lock-settings
+ (c-ts-mode--font-lock-settings 'c))
+ ;; Navigation.
+ (setq-local treesit-defun-tactic 'top-level)
+ (treesit-major-mode-setup)
+
+ ;; Emacs source support: handle DEFUN and FOR_EACH_* gracefully.
+ (when c-ts-mode-emacs-sources-support
+ (setq-local add-log-current-defun-function
+ #'c-ts-mode--emacs-current-defun-name)
+
+ (setq-local treesit-range-settings
+ (treesit-range-rules 'c-ts-mode--emacs-set-ranges))
+
+ (setq-local treesit-language-at-point-function
+ (lambda (_pos) 'c))
+ (treesit-font-lock-recompute-features '(emacs-devel)))
+
+ ;; Inject doxygen parser for comment.
+ (when (treesit-ready-p 'doxygen)
+ (setq-local treesit-primary-parser primary-parser)
+ (setq-local treesit-font-lock-settings
+ (append
+ treesit-font-lock-settings
+ c-ts-mode-doxygen-comment-font-lock-settings))
+ (setq-local treesit-range-settings
+ (treesit-range-rules
+ :embed 'doxygen
+ :host 'c
+ :local t
+ `(((comment) @cap
+ (:match
+ ,c-ts-mode--doxygen-comment-regex @cap)))))))))
(derived-mode-add-parents 'c-ts-mode '(c-mode))
:after-hook (c-ts-mode-set-modeline)
(when (treesit-ready-p 'cpp)
-
- (treesit-parser-create 'cpp)
-
- ;; Syntax.
- (setq-local syntax-propertize-function
- #'c-ts-mode--syntax-propertize)
-
- ;; Indent.
- (setq-local treesit-simple-indent-rules
- (c-ts-mode--get-indent-style 'cpp))
-
- ;; Font-lock.
- (setq-local treesit-font-lock-settings (c-ts-mode--font-lock-settings 'cpp))
- (treesit-major-mode-setup)
-
- (when c-ts-mode-emacs-sources-support
- (setq-local add-log-current-defun-function
- #'c-ts-mode--emacs-current-defun-name))))
+ (let ((primary-parser (treesit-parser-create 'cpp)))
+
+ ;; Syntax.
+ (setq-local syntax-propertize-function
+ #'c-ts-mode--syntax-propertize)
+
+ ;; Indent.
+ (setq-local treesit-simple-indent-rules
+ (c-ts-mode--get-indent-style 'cpp))
+
+ ;; Font-lock.
+ (setq-local treesit-font-lock-settings
+ (c-ts-mode--font-lock-settings 'cpp))
+ (treesit-major-mode-setup)
+
+ (when c-ts-mode-emacs-sources-support
+ (setq-local add-log-current-defun-function
+ #'c-ts-mode--emacs-current-defun-name))
+
+ ;; Inject doxygen parser for comment.
+ (when (treesit-ready-p 'doxygen)
+ (setq-local treesit-primary-parser primary-parser)
+ (setq-local treesit-font-lock-settings
+ (append
+ treesit-font-lock-settings
+ c-ts-mode-doxygen-comment-font-lock-settings))
+ (setq-local treesit-range-settings
+ (treesit-range-rules
+ :embed 'doxygen
+ :host 'cpp
+ :local t
+ `(((comment) @cap
+ (:match
+ ,c-ts-mode--doxygen-comment-regex @cap)))))))))
(derived-mode-add-parents 'c++-ts-mode '(c++-mode))
;;; Commentary:
;;
+;; If the tree-sitter doxygen grammar is available, then the comment
+;; blocks will be highlighted according to this grammar.
;;; Code:
(defvar java-ts-mode--feature-list
- '(( comment definition )
+ '(( comment document definition )
( constant keyword string type)
( annotation expression literal)
( bracket delimiter operator)))
(unless (treesit-ready-p 'java)
(error "Tree-sitter for Java isn't available"))
- (treesit-parser-create 'java)
-
- ;; Comments.
- (c-ts-common-comment-setup)
-
- ;; Indent.
- (setq-local c-ts-common-indent-type-regexp-alist
- `((block . ,(rx (or "class_body"
- "array_initializer"
- "constructor_body"
- "annotation_type_body"
- "interface_body"
- "lambda_expression"
- "enum_body"
- "switch_block"
- "record_declaration_body"
- "block")))
- (close-bracket . "}")
- (if . "if_statement")
- (else . ("if_statement" . "alternative"))
- (for . "for_statement")
- (while . "while_statement")
- (do . "do_statement")))
- (setq-local c-ts-common-indent-offset 'java-ts-mode-indent-offset)
- (setq-local treesit-simple-indent-rules java-ts-mode--indent-rules)
-
- ;; Electric
- (setq-local electric-indent-chars
- (append "{}():;," electric-indent-chars))
-
- ;; Navigation.
- (setq-local treesit-defun-type-regexp
- (regexp-opt '("method_declaration"
- "class_declaration"
- "record_declaration"
- "interface_declaration"
- "enum_declaration"
- "import_declaration"
- "package_declaration"
- "module_declaration"
- "constructor_declaration")))
- (setq-local treesit-defun-name-function #'java-ts-mode--defun-name)
-
- (setq-local treesit-thing-settings
- `((java
- (sexp ,(rx (or "annotation"
- "parenthesized_expression"
- "argument_list"
- "identifier"
- "modifiers"
- "block"
- "body"
- "literal"
- "access"
- "reference"
- "_type"
- "true"
- "false")))
- (sentence ,(rx (or "statement"
- "local_variable_declaration"
- "field_declaration"
- "module_declaration"
- "package_declaration"
- "import_declaration")))
- (text ,(regexp-opt '("line_comment"
- "block_comment"
- "text_block"))))))
-
- ;; Font-lock.
- (setq-local treesit-font-lock-settings java-ts-mode--font-lock-settings)
+ (let ((primary-parser (treesit-parser-create 'java)))
+
+ ;; Comments.
+ (c-ts-common-comment-setup)
+
+ ;; Indent.
+ (setq-local c-ts-common-indent-type-regexp-alist
+ `((block . ,(rx (or "class_body"
+ "array_initializer"
+ "constructor_body"
+ "annotation_type_body"
+ "interface_body"
+ "lambda_expression"
+ "enum_body"
+ "switch_block"
+ "record_declaration_body"
+ "block")))
+ (close-bracket . "}")
+ (if . "if_statement")
+ (else . ("if_statement" . "alternative"))
+ (for . "for_statement")
+ (while . "while_statement")
+ (do . "do_statement")))
+ (setq-local c-ts-common-indent-offset 'java-ts-mode-indent-offset)
+ (setq-local treesit-simple-indent-rules java-ts-mode--indent-rules)
+
+ ;; Electric
+ (setq-local electric-indent-chars
+ (append "{}():;," electric-indent-chars))
+
+ ;; Navigation.
+ (setq-local treesit-defun-type-regexp
+ (regexp-opt '("method_declaration"
+ "class_declaration"
+ "record_declaration"
+ "interface_declaration"
+ "enum_declaration"
+ "import_declaration"
+ "package_declaration"
+ "module_declaration"
+ "constructor_declaration")))
+ (setq-local treesit-defun-name-function #'java-ts-mode--defun-name)
+
+ (setq-local treesit-thing-settings
+ `((java
+ (sexp ,(rx (or "annotation"
+ "parenthesized_expression"
+ "argument_list"
+ "identifier"
+ "modifiers"
+ "block"
+ "body"
+ "literal"
+ "access"
+ "reference"
+ "_type"
+ "true"
+ "false")))
+ (sentence ,(rx (or "statement"
+ "local_variable_declaration"
+ "field_declaration"
+ "module_declaration"
+ "package_declaration"
+ "import_declaration")))
+ (text ,(regexp-opt '("line_comment"
+ "block_comment"
+ "text_block"))))))
+
+ ;; Font-lock.
+ (setq-local treesit-font-lock-settings
+ java-ts-mode--font-lock-settings)
+
+ ;; Inject doxygen parser for comment.
+ (when (treesit-ready-p 'doxygen)
+ (setq-local treesit-primary-parser primary-parser)
+ (setq-local treesit-font-lock-settings
+ (append treesit-font-lock-settings
+ c-ts-mode-doxygen-comment-font-lock-settings))
+ (setq-local treesit-range-settings
+ (treesit-range-rules
+ :embed 'doxygen
+ :host 'java
+ :local t
+ `(((block_comment) @cap (:match "/\\*\\*" @cap)))))))
+
(setq-local treesit-font-lock-feature-list java-ts-mode--feature-list)
;; Imenu.