summaryrefslogtreecommitdiff
path: root/lisp/progmodes/rust-ts-mode.el
diff options
context:
space:
mode:
authorRandy Taylor <dev@rjt.dev>2023-02-08 21:43:04 -0500
committerDmitry Gutov <dgutov@yandex.ru>2023-02-14 23:54:58 +0200
commita3a1ef7bd5eb7a3b74b0fd80ce78ef234c25f573 (patch)
tree28377b638081323ee9ce968d5faeb29e50417bf2 /lisp/progmodes/rust-ts-mode.el
parent477aa047ee73d2b93c04a88700263e58cf7bab70 (diff)
downloademacs-a3a1ef7bd5eb7a3b74b0fd80ce78ef234c25f573.tar.gz
emacs-a3a1ef7bd5eb7a3b74b0fd80ce78ef234c25f573.tar.bz2
emacs-a3a1ef7bd5eb7a3b74b0fd80ce78ef234c25f573.zip
Fix rust-ts-mode type and module highlighting (Bug#61302)
* lisp/progmodes/rust-ts-mode.el (rust-ts-mode--font-lock-settings): Specify import queries to avoid clashing with scoped identifiers in the code. Highlight attributes with font-lock-preprocessor-face.
Diffstat (limited to 'lisp/progmodes/rust-ts-mode.el')
-rw-r--r--lisp/progmodes/rust-ts-mode.el88
1 files changed, 72 insertions, 16 deletions
diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el
index f709b16ff39..f510b7bb6c9 100644
--- a/lisp/progmodes/rust-ts-mode.el
+++ b/lisp/progmodes/rust-ts-mode.el
@@ -124,8 +124,8 @@
(treesit-font-lock-rules
:language 'rust
:feature 'attribute
- '((attribute_item) @font-lock-constant-face
- (inner_attribute_item) @font-lock-constant-face)
+ '((attribute_item) @font-lock-preprocessor-face
+ (inner_attribute_item) @font-lock-preprocessor-face)
:language 'rust
:feature 'bracket
@@ -148,12 +148,6 @@
'(([(block_comment) (line_comment)]) @font-lock-comment-face)
:language 'rust
- :feature 'constant
- `((boolean_literal) @font-lock-constant-face
- ((identifier) @font-lock-constant-face
- (:match "^[A-Z][A-Z\\d_]*$" @font-lock-constant-face)))
-
- :language 'rust
:feature 'delimiter
'((["," "." ";" ":" "::"]) @font-lock-delimiter-face)
@@ -211,7 +205,54 @@
:language 'rust
:feature 'type
- `((enum_variant name: (identifier) @font-lock-type-face)
+ `((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))
+
+ (enum_variant name: (identifier) @font-lock-type-face)
(match_arm
pattern: (match_pattern (_ type: (identifier) @font-lock-type-face)))
(match_arm
@@ -226,24 +267,39 @@
((scoped_identifier path: (identifier) @font-lock-type-face)
(:match "^[A-Z]" @font-lock-type-face))
((scoped_identifier
- (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_type_identifier path: (identifier) @font-lock-type-face)
+ ((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
- (use_as_clause alias: (identifier) @font-lock-type-face)
- (use_list (identifier) @font-lock-type-face))
+ ;; Ensure function calls aren't highlighted as types.
+ (call_expression function: (scoped_identifier name: (identifier) @default)))
:language 'rust
:feature 'property
'((field_identifier) @font-lock-property-face
(shorthand_field_initializer (identifier) @font-lock-property-face))
+ ;; Must be under type, otherwise some imports can be highlighted as consants.
+ :language 'rust
+ :feature 'constant
+ `((boolean_literal) @font-lock-constant-face
+ ((identifier) @font-lock-constant-face
+ (:match "^[A-Z][A-Z\\d_]*$" @font-lock-constant-face)))
+
:language 'rust
:feature 'variable
'((identifier) @font-lock-variable-name-face