diff options
| author | Damien Cassou | 2024-06-14 10:46:42 +0200 |
|---|---|---|
| committer | Dmitry Gutov | 2024-06-24 01:31:03 +0300 |
| commit | 0edacf2aa7e53d0cec95bcaae4cd19e5389b70f8 (patch) | |
| tree | 3db0a94f8a13122f629427f471a12b7377c1897f | |
| parent | cace0cbee93f2a7f70a14a8445abcd176d3b3af2 (diff) | |
| download | emacs-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.el | 54 |
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. |
| 3858 | See `treesit-thing-settings' for more information.") | 3883 | See `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 |