aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Cassou2024-06-14 10:46:42 +0200
committerDmitry Gutov2024-06-24 01:31:03 +0300
commit0edacf2aa7e53d0cec95bcaae4cd19e5389b70f8 (patch)
tree3db0a94f8a13122f629427f471a12b7377c1897f
parentcace0cbee93f2a7f70a14a8445abcd176d3b3af2 (diff)
downloademacs-0edacf2aa7e53d0cec95bcaae4cd19e5389b70f8.tar.gz
emacs-0edacf2aa7e53d0cec95bcaae4cd19e5389b70f8.zip
Add jsdoc support to js-ts-mode
* lisp/progmodes/js.el (js--treesit-font-lock-settings): Add jsdoc font-lock settings. (js--treesit-jsdoc-beginning-regexp): New variable to match the beginning of a jsdoc block. (js-ts-mode): Add jsdoc support. Save the 'javascript parser to `treesit-primary-parser'. Configure `treesit-range-settings' to use a jsdoc parser within a JavaScript file. (js-ts-language-at-point): New function to return either 'jsdoc or 'javascript depending on where the point is.
-rw-r--r--lisp/progmodes/js.el54
1 files changed, 52 insertions, 2 deletions
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index f5629ff8fbe..529b31669ed 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3634,7 +3634,32 @@ Check if a node type is available, then return the right indent rules."
3634 :language 'javascript 3634 :language 'javascript
3635 :feature 'escape-sequence 3635 :feature 'escape-sequence
3636 :override t 3636 :override t
3637 '((escape_sequence) @font-lock-escape-face)) 3637 '((escape_sequence) @font-lock-escape-face)
3638
3639 :language 'jsdoc
3640 :override t
3641 :feature 'keyword
3642 '((tag_name) @font-lock-keyword-face)
3643
3644 :language 'jsdoc
3645 :override t
3646 :feature 'bracket
3647 '((["{" "}"]) @font-lock-bracket-face)
3648
3649 :language 'jsdoc
3650 :override t
3651 :feature 'property
3652 '((type) @font-lock-variable-use-face)
3653
3654 :language 'jsdoc
3655 :override t
3656 :feature 'definition
3657 '((identifier) @font-lock-variable-name-face)
3658
3659 :language 'jsdoc
3660 :override t
3661 :feature 'comment
3662 '((description) @font-lock-comment-face))
3638 "Tree-sitter font-lock settings.") 3663 "Tree-sitter font-lock settings.")
3639 3664
3640(defun js--fontify-template-string (node override start end &rest _) 3665(defun js--fontify-template-string (node override start end &rest _)
@@ -3857,6 +3882,9 @@ See `treesit-thing-settings' for more information.")
3857 "Nodes that designate sexps in JavaScript. 3882 "Nodes that designate sexps in JavaScript.
3858See `treesit-thing-settings' for more information.") 3883See `treesit-thing-settings' for more information.")
3859 3884
3885(defvar js--treesit-jsdoc-beginning-regexp (rx bos "/**")
3886 "Regular expression matching the beginning of a jsdoc block comment.")
3887
3860;;;###autoload 3888;;;###autoload
3861(define-derived-mode js-ts-mode js-base-mode "JavaScript" 3889(define-derived-mode js-ts-mode js-base-mode "JavaScript"
3862 "Major mode for editing JavaScript. 3890 "Major mode for editing JavaScript.
@@ -3882,7 +3910,8 @@ See `treesit-thing-settings' for more information.")
3882 (setq-local syntax-propertize-function #'js-ts--syntax-propertize) 3910 (setq-local syntax-propertize-function #'js-ts--syntax-propertize)
3883 3911
3884 ;; Tree-sitter setup. 3912 ;; Tree-sitter setup.
3885 (treesit-parser-create 'javascript) 3913 (setq-local treesit-primary-parser (treesit-parser-create 'javascript))
3914
3886 ;; Indent. 3915 ;; Indent.
3887 (setq-local treesit-simple-indent-rules js--treesit-indent-rules) 3916 (setq-local treesit-simple-indent-rules js--treesit-indent-rules)
3888 ;; Navigation. 3917 ;; Navigation.
@@ -3909,6 +3938,16 @@ See `treesit-thing-settings' for more information.")
3909 ( assignment constant escape-sequence jsx number 3938 ( assignment constant escape-sequence jsx number
3910 pattern string-interpolation) 3939 pattern string-interpolation)
3911 ( bracket delimiter function operator property))) 3940 ( bracket delimiter function operator property)))
3941
3942 (when (treesit-ready-p 'jsdoc t)
3943 (setq-local treesit-range-settings
3944 (treesit-range-rules
3945 :embed 'jsdoc
3946 :host 'javascript
3947 `(((comment) @capture (:match ,js--treesit-jsdoc-beginning-regexp @capture))))))
3948
3949 (setq-local treesit-language-at-point-function #'js-ts-language-at-point)
3950
3912 ;; Imenu 3951 ;; Imenu
3913 (setq-local treesit-simple-imenu-settings 3952 (setq-local treesit-simple-imenu-settings
3914 `(("Function" "\\`function_declaration\\'" nil nil) 3953 `(("Function" "\\`function_declaration\\'" nil nil)
@@ -3950,6 +3989,17 @@ See `treesit-thing-settings' for more information.")
3950 (put-text-property ns (1+ ns) 'syntax-table syntax) 3989 (put-text-property ns (1+ ns) 'syntax-table syntax)
3951 (put-text-property (1- ne) ne 'syntax-table syntax))))) 3990 (put-text-property (1- ne) ne 'syntax-table syntax)))))
3952 3991
3992(defun js-ts-language-at-point (point)
3993 "Return the language at POINT."
3994 (let ((node (treesit-node-at point 'javascript)))
3995 (if (and (treesit-ready-p 'jsdoc)
3996 (equal (treesit-node-type node) "comment")
3997 (string-match-p
3998 js--treesit-jsdoc-beginning-regexp
3999 (treesit-node-text node)))
4000 'jsdoc
4001 'javascript)))
4002
3953;;;###autoload 4003;;;###autoload
3954(define-derived-mode js-json-mode prog-mode "JSON" 4004(define-derived-mode js-json-mode prog-mode "JSON"
3955 :syntax-table js-mode-syntax-table 4005 :syntax-table js-mode-syntax-table