summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorYuan Fu <casouri@gmail.com>2023-01-26 17:49:45 -0800
committerYuan Fu <casouri@gmail.com>2023-01-29 00:12:56 -0800
commit1c3ca3bb649b7e812a84b4a559463462d4357080 (patch)
tree933415aecabc4d6cd662d3f7463d408c53f26061 /lisp
parent56e8607dc99b90c43f82001cbf073e58a4698298 (diff)
downloademacs-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.el26
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)