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.
This commit is contained in:
Yuan Fu 2023-01-26 17:49:45 -08:00
parent 56e8607dc9
commit 1c3ca3bb64
No known key found for this signature in database
GPG key ID: 56E19BC57664A442

View file

@ -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)