(preproc_def
    "#define" @context
    name: (_) @name) @item

(preproc_function_def
    "#define" @context
    name: (_) @name
    parameters: (preproc_params
        "(" @context
        ")" @context)) @item

(type_definition
    "typedef" @context
    declarator: (_) @name) @item

(struct_specifier
    "struct" @context
    name: (_) @name) @item

(class_specifier
    "class" @context
    name: (_) @name) @item

(enum_specifier
    "enum" @context
    name: (_) @name) @item

(enumerator
    name: (_) @name) @item

(declaration
    (storage_class_specifier) @context
    (type_qualifier)? @context
    type: (_) @context
    declarator: (init_declarator
      declarator: (_) @name)) @item

(function_definition
    (type_qualifier)? @context
    type: (_)? @context
    declarator: [
        (function_declarator
            declarator: (_) @name
            parameters: (parameter_list
                "(" @context
                ")" @context))
        (pointer_declarator
            "*" @context
            declarator: (function_declarator
                declarator: (_) @name
                parameters: (parameter_list
                    "(" @context
                    ")" @context)))
        (pointer_declarator
            "*" @context
            declarator: (pointer_declarator
                "*" @context
                declarator: (function_declarator
                    declarator: (_) @name
                    parameters: (parameter_list
                        "(" @context
                        ")" @context))))
        (reference_declarator
            ["&" "&&"] @context
            (function_declarator
                declarator: (_) @name
                parameters: (parameter_list
                    "(" @context
                    ")" @context)))
    ]
    (type_qualifier)? @context) @item

(declaration
    (type_qualifier)? @context
    type: (_)? @context
    declarator: [
        (field_identifier) @name
        (pointer_declarator
            "*" @context
            declarator: (field_identifier) @name)
        (function_declarator
            declarator: (_) @name
            parameters: (parameter_list
                "(" @context
                ")" @context))
        (pointer_declarator
            "*" @context
            declarator: (function_declarator
                declarator: (_) @name
                parameters: (parameter_list
                    "(" @context
                    ")" @context)))
        (pointer_declarator
            "*" @context
            declarator: (pointer_declarator
                "*" @context
                declarator: (function_declarator
                    declarator: (_) @name
                    parameters: (parameter_list
                        "(" @context
                        ")" @context))))
        (reference_declarator
            ["&" "&&"] @context
            (function_declarator
                declarator: (_) @name
                parameters: (parameter_list
                    "(" @context
                    ")" @context)))
    ]
    (type_qualifier)? @context) @item

(field_declaration
    (type_qualifier)? @context
    type: (_) @context
    declarator: [
        (field_identifier) @name
        (pointer_declarator
            "*" @context
            declarator: (field_identifier) @name)
        (function_declarator
            declarator: (_) @name
            parameters: (parameter_list
                "(" @context
                ")" @context))
        (pointer_declarator
            "*" @context
            declarator: (function_declarator
                declarator: (_) @name
                parameters: (parameter_list
                    "(" @context
                    ")" @context)))
        (pointer_declarator
            "*" @context
            declarator: (pointer_declarator
                "*" @context
                declarator: (function_declarator
                    declarator: (_) @name
                    parameters: (parameter_list
                        "(" @context
                        ")" @context))))
        (reference_declarator
            ["&" "&&"] @context
            (function_declarator
                declarator: (_) @name
                parameters: (parameter_list
                    "(" @context
                    ")" @context)))
    ]
    (type_qualifier)? @context) @item
