1(preproc_def
  2    "#define" @context
  3    name: (_) @name) @item
  4
  5(preproc_function_def
  6    "#define" @context
  7    name: (_) @name
  8    parameters: (preproc_params
  9        "(" @context
 10        ")" @context)) @item
 11
 12(type_definition
 13    "typedef" @context
 14    declarator: (_) @name) @item
 15
 16(struct_specifier
 17    "struct" @context
 18    name: (_) @name) @item
 19
 20(class_specifier
 21    "class" @context
 22    name: (_) @name) @item
 23
 24(enum_specifier
 25    "enum" @context
 26    name: (_) @name) @item
 27
 28(enumerator
 29    name: (_) @name) @item
 30
 31(concept_definition
 32    "concept" @context
 33    name: (_) @name) @item
 34
 35(declaration
 36    (storage_class_specifier) @context
 37    (type_qualifier)? @context
 38    type: (_) @context
 39    declarator: (init_declarator
 40      declarator: (_) @name)) @item
 41
 42(function_definition
 43    (type_qualifier)? @context
 44    type: (_)? @context
 45    declarator: [
 46        (function_declarator
 47            declarator: (_) @name
 48            parameters: (parameter_list
 49                "(" @context
 50                ")" @context))
 51        (pointer_declarator
 52            "*" @context
 53            declarator: (function_declarator
 54                declarator: (_) @name
 55                parameters: (parameter_list
 56                    "(" @context
 57                    ")" @context)))
 58        (pointer_declarator
 59            "*" @context
 60            declarator: (pointer_declarator
 61                "*" @context
 62                declarator: (function_declarator
 63                    declarator: (_) @name
 64                    parameters: (parameter_list
 65                        "(" @context
 66                        ")" @context))))
 67        (reference_declarator
 68            ["&" "&&"] @context
 69            (function_declarator
 70                declarator: (_) @name
 71                parameters: (parameter_list
 72                    "(" @context
 73                    ")" @context)))
 74    ]
 75    (type_qualifier)? @context) @item
 76
 77(declaration
 78    (type_qualifier)? @context
 79    type: (_)? @context
 80    declarator: [
 81        (field_identifier) @name
 82        (pointer_declarator
 83            "*" @context
 84            declarator: (field_identifier) @name)
 85        (function_declarator
 86            declarator: (_) @name
 87            parameters: (parameter_list
 88                "(" @context
 89                ")" @context))
 90        (pointer_declarator
 91            "*" @context
 92            declarator: (function_declarator
 93                declarator: (_) @name
 94                parameters: (parameter_list
 95                    "(" @context
 96                    ")" @context)))
 97        (pointer_declarator
 98            "*" @context
 99            declarator: (pointer_declarator
100                "*" @context
101                declarator: (function_declarator
102                    declarator: (_) @name
103                    parameters: (parameter_list
104                        "(" @context
105                        ")" @context))))
106        (reference_declarator
107            ["&" "&&"] @context
108            (function_declarator
109                declarator: (_) @name
110                parameters: (parameter_list
111                    "(" @context
112                    ")" @context)))
113    ]
114    (type_qualifier)? @context) @item
115
116(field_declaration
117    (type_qualifier)? @context
118    type: (_) @context
119    declarator: [
120        (field_identifier) @name
121        (pointer_declarator
122            "*" @context
123            declarator: (field_identifier) @name)
124        (function_declarator
125            declarator: (_) @name
126            parameters: (parameter_list
127                "(" @context
128                ")" @context))
129        (pointer_declarator
130            "*" @context
131            declarator: (function_declarator
132                declarator: (_) @name
133                parameters: (parameter_list
134                    "(" @context
135                    ")" @context)))
136        (pointer_declarator
137            "*" @context
138            declarator: (pointer_declarator
139                "*" @context
140                declarator: (function_declarator
141                    declarator: (_) @name
142                    parameters: (parameter_list
143                        "(" @context
144                        ")" @context))))
145        (reference_declarator
146            ["&" "&&"] @context
147            (function_declarator
148                declarator: (_) @name
149                parameters: (parameter_list
150                    "(" @context
151                    ")" @context)))
152    ; Fields declarations may define multiple fields, and so @item is on the
153    ; declarator so they each get distinct ranges.
154    ] @item
155    (type_qualifier)? @context)
156
157(comment) @annotation