diff options
author | Yuan Fu <casouri@gmail.com> | 2023-01-26 17:49:45 -0800 |
---|---|---|
committer | Yuan Fu <casouri@gmail.com> | 2023-01-29 00:12:56 -0800 |
commit | 1c3ca3bb649b7e812a84b4a559463462d4357080 (patch) | |
tree | 933415aecabc4d6cd662d3f7463d408c53f26061 /lisp | |
parent | 56e8607dc99b90c43f82001cbf073e58a4698298 (diff) | |
download | emacs-1c3ca3bb649b7e812a84b4a559463462d4357080.tar.gz emacs-1c3ca3bb649b7e812a84b4a559463462d4357080.tar.bz2 emacs-1c3ca3bb649b7e812a84b4a559463462d4357080.zip |
Fix <> syntax in rust-ts-mode
Similar to bug#60351, the angle brackets in rust-ts-mode are not
recognized as pairs when they should be. This change copies the
function used by c++-ts-mode and adapts it to rust-ts-mode.
* lisp/progmodes/rust-ts-mode.el:
(rust-ts-mode--syntax-propertize): New function.
(rust-ts-mode): Set up syntax-propertize-function.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/progmodes/rust-ts-mode.el | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el index 3a6cb61b719..2812e39c101 100644 --- a/lisp/progmodes/rust-ts-mode.el +++ b/lisp/progmodes/rust-ts-mode.el @@ -275,6 +275,28 @@ Return nil if there is no name or if NODE is not a defun node." (treesit-node-text (treesit-node-child-by-field-name node "name") t)))) +(defun rust-ts-mode--syntax-propertize (beg end) + "Apply syntax text property to template delimiters between BEG and END. + +< and > are usually punctuation, e.g., as greater/less-than. But +when used for types, they should be considered pairs. + +This function checks for < and > in the changed RANGES and apply +appropriate text property to alter the syntax of template +delimiters < and >'s." + (goto-char beg) + (while (re-search-forward (rx (or "<" ">")) end t) + (pcase (treesit-node-type + (treesit-node-parent + (treesit-node-at (match-beginning 0)))) + ("type_arguments" + (put-text-property (match-beginning 0) + (match-end 0) + 'syntax-table + (pcase (char-before) + (?< '(4 . ?>)) + (?> '(5 . ?<)))))))) + ;;;###autoload (define-derived-mode rust-ts-mode prog-mode "Rust" "Major mode for editing Rust, powered by tree-sitter." @@ -284,6 +306,10 @@ Return nil if there is no name or if NODE is not a defun node." (when (treesit-ready-p 'rust) (treesit-parser-create 'rust) + ;; Syntax. + (setq-local syntax-propertize-function + #'rust-ts-mode--syntax-propertize) + ;; Comments. (c-ts-common-comment-setup) |