From 4a933e123daa6a05164c806493b10c3e7a8a0af8 Mon Sep 17 00:00:00 2001 From: Randy Taylor Date: Wed, 8 Feb 2023 21:43:04 -0500 Subject: [PATCH] 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. --- lisp/progmodes/rust-ts-mode.el | 93 ++++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 21 deletions(-) diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el index 5c71a8ad461..d0ff49e2f26 100644 --- a/lisp/progmodes/rust-ts-mode.el +++ b/lisp/progmodes/rust-ts-mode.el @@ -124,8 +124,8 @@ rust-ts-mode--font-lock-settings (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 @@ -147,12 +147,6 @@ rust-ts-mode--font-lock-settings :feature 'comment '(([(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) @@ -206,7 +200,54 @@ rust-ts-mode--font-lock-settings :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 @@ -220,25 +261,35 @@ rust-ts-mode--font-lock-settings (:match "^[A-Z]" @font-lock-type-face)) ((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 -- 2.39.1