mirror of
https://github.com/helix-editor/helix.git
synced 2024-11-24 10:26:18 +04:00
rust highlights: clean up constructor logic (#8957)
Enum variants and (tuple) structs are indistinguishable in general, so we mark any PascalCase pattern or expression as a "constructor", which covers all three.
This commit is contained in:
parent
7fd266efa9
commit
a680b2e409
@ -189,6 +189,33 @@
|
||||
|
||||
; TODO: variable.mut to highlight mutable identifiers via locals.scm
|
||||
|
||||
; -------
|
||||
; Constructors
|
||||
; -------
|
||||
; TODO: this is largely guesswork, remove it once we get actual info from locals.scm or r-a
|
||||
|
||||
(struct_expression
|
||||
name: (type_identifier) @constructor)
|
||||
|
||||
(tuple_struct_pattern
|
||||
type: [
|
||||
(identifier) @constructor
|
||||
(scoped_identifier
|
||||
name: (identifier) @constructor)
|
||||
])
|
||||
(struct_pattern
|
||||
type: [
|
||||
((type_identifier) @constructor)
|
||||
(scoped_type_identifier
|
||||
name: (type_identifier) @constructor)
|
||||
])
|
||||
(match_pattern
|
||||
((identifier) @constructor) (#match? @constructor "^[A-Z]"))
|
||||
(or_pattern
|
||||
((identifier) @constructor)
|
||||
((identifier) @constructor)
|
||||
(#match? @constructor "^[A-Z]"))
|
||||
|
||||
; -------
|
||||
; Guess Other Types
|
||||
; -------
|
||||
@ -203,33 +230,28 @@
|
||||
|
||||
(call_expression
|
||||
function: [
|
||||
((identifier) @type.enum.variant
|
||||
(#match? @type.enum.variant "^[A-Z]"))
|
||||
((identifier) @constructor
|
||||
(#match? @constructor "^[A-Z]"))
|
||||
(scoped_identifier
|
||||
name: ((identifier) @type.enum.variant
|
||||
(#match? @type.enum.variant "^[A-Z]")))
|
||||
name: ((identifier) @constructor
|
||||
(#match? @constructor "^[A-Z]")))
|
||||
])
|
||||
|
||||
; ---
|
||||
; Assume that types in match arms are enums and not
|
||||
; tuple structs. Same for `if let` expressions.
|
||||
; PascalCase identifiers under a path which is also PascalCase
|
||||
; are assumed to be constructors if they have methods or fields.
|
||||
; ---
|
||||
|
||||
(match_pattern
|
||||
(field_expression
|
||||
value: (scoped_identifier
|
||||
path: [
|
||||
(identifier) @type
|
||||
(scoped_identifier
|
||||
name: (identifier) @constructor))
|
||||
(tuple_struct_pattern
|
||||
type: [
|
||||
((identifier) @constructor)
|
||||
(scoped_identifier
|
||||
name: (identifier) @constructor)
|
||||
])
|
||||
(struct_pattern
|
||||
type: [
|
||||
((type_identifier) @constructor)
|
||||
(scoped_type_identifier
|
||||
name: (type_identifier) @constructor)
|
||||
])
|
||||
name: (identifier) @type)
|
||||
]
|
||||
name: (identifier) @constructor
|
||||
(#match? @type "^[A-Z]")
|
||||
(#match? @constructor "^[A-Z]")))
|
||||
|
||||
; ---
|
||||
; Other PascalCase identifiers are assumed to be structs.
|
||||
|
Loading…
Reference in New Issue
Block a user