diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el index ec823d09d8c..d6b28f43182 100644 --- a/lisp/progmodes/rust-ts-mode.el +++ b/lisp/progmodes/rust-ts-mode.el @@ -208,50 +208,11 @@ rust-ts-mode--font-lock-settings `((scoped_use_list path: (identifier) @font-lock-constant-face) (scoped_use_list path: (scoped_identifier name: (identifier) @font-lock-constant-face)) - - ((use_as_clause alias: (identifier) @font-lock-type-face) - (:match "^[A-Z]" @font-lock-type-face)) - ((use_as_clause path: (identifier) @font-lock-type-face) - (:match "^[A-Z]" @font-lock-type-face)) - ((use_as_clause path: - (scoped_identifier path: (_) - name: (identifier) @font-lock-type-face)) - (:match "^[A-Z]" @font-lock-type-face)) - (use_as_clause path: (scoped_identifier name: (identifier) @default)) - - ((use_declaration - argument: (scoped_identifier - path: (_) @font-lock-constant-face - name: (identifier) @font-lock-type-face)) - (:match "^[A-Z]" @font-lock-type-face)) - (use_declaration - argument: (scoped_identifier - name: (identifier) @default)) - - (use_declaration - argument: (scoped_identifier - path: (scoped_identifier - path: (_) @font-lock-constant-face - name: (identifier) @font-lock-constant-face) - name: (identifier) @default)) - - (use_declaration - argument: (scoped_use_list - path: (scoped_identifier - path: (_) @font-lock-constant-face - name: (identifier) @font-lock-constant-face))) - ((use_list (identifier) @font-lock-type-face) (:match "^[A-Z]" @font-lock-type-face)) - (use_list (identifier) @default) - ((use_list (scoped_identifier path: (_) - name: (identifier) @font-lock-type-face)) - (:match "^[A-Z]" @font-lock-type-face)) - (use_list (scoped_identifier path: (_) - name: (identifier) @default)) - (use_wildcard (scoped_identifier - name: (identifier) @font-lock-constant-face)) - + (use_wildcard [(identifier) @rust-ts-mode--fontify-scope + (scoped_identifier + name: (identifier) @rust-ts-mode--fontify-scope)]) (enum_variant name: (identifier) @font-lock-type-face) (match_arm pattern: (match_pattern (_ type: (identifier) @font-lock-type-face))) @@ -262,31 +223,13 @@ rust-ts-mode--font-lock-settings (mod_item name: (identifier) @font-lock-constant-face) (primitive_type) @font-lock-type-face (type_identifier) @font-lock-type-face - ((scoped_identifier name: (identifier) @font-lock-type-face) - (:match "^[A-Z]" @font-lock-type-face)) - ((scoped_identifier path: (identifier) @font-lock-type-face) - (:match "^[A-Z]" @font-lock-type-face)) - ((scoped_identifier - path: [(identifier) @font-lock-type-face - (scoped_identifier - name: (identifier) @font-lock-type-face)]) - (:match "^[A-Z]" @font-lock-type-face)) + ((scoped_identifier name: (identifier) @rust-ts-mode--fontify-tail)) ((scoped_identifier path: (identifier) @font-lock-type-face) (:match "^\\(u8\\|u16\\|u32\\|u64\\|u128\\|usize\\|i8\\|i16\\|i32\\|i64\\|i128\\|isize\\|char\\|str\\)$" @font-lock-type-face)) - (scoped_identifier path: (_) @font-lock-constant-face - name: (identifier) @font-lock-type-face) - (scoped_identifier path: (scoped_identifier - name: (identifier) @font-lock-constant-face)) - (scoped_type_identifier path: (_) @font-lock-constant-face) - (scoped_type_identifier - path: (scoped_identifier - path: (_) @font-lock-constant-face - name: (identifier) @font-lock-constant-face)) - (type_identifier) @font-lock-type-face - ;; Ensure function calls aren't highlighted as types. - (call_expression function: (scoped_identifier name: (identifier) @default))) + ((scoped_identifier path: (identifier) @rust-ts-mode--fontify-scope)) + (type_identifier) @font-lock-type-face) :language 'rust :feature 'property @@ -302,9 +245,8 @@ rust-ts-mode--font-lock-settings :language 'rust :feature 'variable - '((identifier) @font-lock-variable-name-face - ;; Everything in a token_tree is an identifier. - (token_tree (identifier) @default)) + '(((identifier) @font-lock-variable-name-face + (:pred rust-ts-mode--variable-p @font-lock-variable-name-face))) :language 'rust :feature 'escape-sequence @@ -317,6 +259,41 @@ rust-ts-mode--font-lock-settings '((ERROR) @font-lock-warning-face)) "Tree-sitter font-lock settings for `rust-ts-mode'.") +(defun rust-ts-mode--fontify-scope (node override start end &optional tail-p) + (let* ((case-fold-search nil) + (face + (cond + ((string-match-p "^[A-Z]" (treesit-node-text node)) + 'font-lock-type-face) + ((and tail-p + (not (rust-ts-mode--tail-fontify-p (treesit-node-parent node)))) + nil) + (t 'font-lock-constant-face)))) + (and face + (treesit-fontify-with-override + (treesit-node-start node) (treesit-node-end node) + face + override start end)))) + +(defun rust-ts-mode--fontify-tail (node override start end) + (rust-ts-mode--fontify-scope node override start end t)) + +(defun rust-ts-mode--tail-fontify-p (node) + (not + (string-match-p "\\`\\(?:use_list\\|call_expression\\|use_as_clause\\|use_declaration\\)\\'" + (treesit-node-type (treesit-node-parent node))))) + +(defun rust-ts-mode--variable-p (node) + (let* ((parent (treesit-node-parent node)) + (parent-type (treesit-node-type parent))) + (cond + ;; Everything in a token_tree is an identifier. + ((equal "token_tree" parent-type) + nil) + ((equal "scoped_identifier" parent-type) + (rust-ts-mode--tail-fontify-p parent)) + (t t)))) + (defalias 'rust-ts-mode--fontify-pattern (and (treesit-available-p)