@@ -0,0 +1,336 @@
2+; Tree-Sitter doesn't allow overrides in regards to captures,
3+; though it is possible to affect the child node of a captured
4+; node. Thus, the approach here is to flip the order so that
5+; overrides are unnecessary.
16+(escape_sequence) @constant.character.escape
17+(primitive_type) @type.builtin
18+(boolean_literal) @constant.builtin.boolean
19+(integer_literal) @constant.numeric.integer
20+(float_literal) @constant.numeric.float
21+(char_literal) @constant.character
35+(self) @variable.builtin
36+(enum_variant (identifier) @type.enum.variant)
39+ (field_identifier) @variable.other.member)
40+(shorthand_field_initializer
41+ (identifier) @variable.other.member)
42+(shorthand_field_identifier) @variable.other.member
57+] @punctuation.delimiter
67+] @punctuation.bracket
72+ ] @punctuation.bracket)
77+ ] @punctuation.bracket)
79+ "|" @punctuation.bracket)
87+ ((identifier) @variable)
89+ (identifier) @variable))
92+; It needs to be anonymous to not conflict with `call_expression` further below.
94+ value: (field_expression
95+ value: (identifier)? @variable
96+ field: (field_identifier) @variable.other.member))
99+ pattern: (identifier) @variable.parameter)
101+ (identifier) @variable.parameter)
108+ "for" @keyword.control.repeat)
109+((identifier) @keyword.control
110+ (#match? @keyword.control "^yield$"))
112+"in" @keyword.control
118+] @keyword.control.conditional
122+] @keyword.control.repeat
128+] @keyword.control.return
136+"use" @keyword.control.import
137+(dep_item "dep" @keyword.control.import !body)
138+(use_as_clause "as" @keyword.control.import)
140+(type_cast_expression "as" @keyword.operator)
159+] @keyword.storage.type
161+"let" @keyword.storage
162+"fn" @keyword.function
163+"abi" @keyword.function
165+(mutable_specifier) @keyword.storage.modifier.mut
167+(reference_type "&" @keyword.storage.modifier.ref)
168+(self_parameter "&" @keyword.storage.modifier.ref)
175+] @keyword.storage.modifier
177+; TODO: variable.mut to highlight mutable identifiers via locals.scm
183+((identifier) @constant
184+ (#match? @constant "^[A-Z][A-Z\\d_]*$"))
187+; PascalCase identifiers in call_expressions (e.g. `Ok()`)
188+; are assumed to be enum constructors.
193+ ((identifier) @type.enum.variant
194+ (#match? @type.enum.variant "^[A-Z]"))
196+ name: ((identifier) @type.enum.variant
197+ (#match? @type.enum.variant "^[A-Z]")))
201+; Assume that types in match arms are enums and not
202+; tuple structs. Same for `if let` expressions.
207+ name: (identifier) @constructor))
208+(tuple_struct_pattern
210+ ((identifier) @constructor)
212+ name: (identifier) @constructor)
216+ ((type_identifier) @constructor)
217+ (scoped_type_identifier
218+ name: (type_identifier) @constructor)
222+; Other PascalCase identifiers are assumed to be structs.
226+ (#match? @type "^[A-Z]"))
234+ ((identifier) @function)
236+ name: (identifier) @function)
238+ field: (field_identifier) @function)
242+ ((identifier) @function)
244+ name: (identifier) @function)
246+ field: (field_identifier) @function.method)
250+ name: (identifier) @function)
252+(function_signature_item
253+ name: (identifier) @function)
305+ argument: (identifier) @namespace)
307+ (identifier) @namespace)
309+ name: (identifier) @namespace)
311+ path: (identifier)? @namespace)
313+ (identifier) @namespace)
315+ path: (identifier)? @namespace
316+ alias: (identifier) @namespace)
323+ path: (identifier)? @namespace
324+ name: (identifier) @namespace)
325+(scoped_type_identifier
326+ path: (identifier) @namespace)
329+; Remaining Identifiers
334+(type_identifier) @type
335+(identifier) @variable
336+(field_identifier) @variable.other.member