@ -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` expression s.
; PascalCase identifiers under a path which is also PascalCase
; are assumed to be constructors if they have methods or field s.
; ---
( 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.