Skip to content

Commit

Permalink
rust highlights: clean up constructor logic (helix-editor#8957)
Browse files Browse the repository at this point in the history
Enum variants and (tuple) structs are indistinguishable in general, so we
mark any PascalCase pattern or expression as a "constructor", which
covers all three.
  • Loading branch information
rosefromthedead authored and dgkf committed Jan 30, 2024
1 parent 1c01f37 commit 412518e
Showing 1 changed file with 43 additions and 21 deletions.
64 changes: 43 additions & 21 deletions runtime/queries/rust/highlights.scm
Original file line number Diff line number Diff line change
Expand Up @@ -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
; -------
Expand All @@ -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
(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)
])
(field_expression
value: (scoped_identifier
path: [
(identifier) @type
(scoped_identifier
name: (identifier) @type)
]
name: (identifier) @constructor
(#match? @type "^[A-Z]")
(#match? @constructor "^[A-Z]")))

; ---
; Other PascalCase identifiers are assumed to be structs.
Expand Down

0 comments on commit 412518e

Please sign in to comment.