1(internal_module
  2    "namespace" @context
  3    name: (_) @name) @item
  4
  5(enum_declaration
  6    "enum" @context
  7    name: (_) @name) @item
  8
  9(type_alias_declaration
 10    "type" @context
 11    name: (_) @name) @item
 12
 13(function_declaration
 14    "async"? @context
 15    "function" @context
 16    name: (_) @name
 17    parameters: (formal_parameters
 18      "(" @context
 19      ")" @context)) @item
 20
 21(generator_function_declaration
 22    "async"? @context
 23    "function" @context
 24    "*" @context
 25    name: (_) @name
 26    parameters: (formal_parameters
 27      "(" @context
 28      ")" @context)) @item
 29
 30(interface_declaration
 31    "interface" @context
 32    name: (_) @name) @item
 33
 34(export_statement
 35    (lexical_declaration
 36        ["let" "const"] @context
 37        (variable_declarator
 38            name: (identifier) @name) @item))
 39
 40; Exported array destructuring
 41(export_statement
 42    (lexical_declaration
 43        ["let" "const"] @context
 44        (variable_declarator
 45            name: (array_pattern
 46                [
 47                    (identifier) @name @item
 48                    (assignment_pattern left: (identifier) @name @item)
 49                    (rest_pattern (identifier) @name @item)
 50                ]))))
 51
 52; Exported object destructuring
 53(export_statement
 54    (lexical_declaration
 55        ["let" "const"] @context
 56        (variable_declarator
 57            name: (object_pattern
 58                [(shorthand_property_identifier_pattern) @name @item
 59                 (pair_pattern
 60                     value: (identifier) @name @item)
 61                 (pair_pattern
 62                     value: (assignment_pattern left: (identifier) @name @item))
 63                 (rest_pattern (identifier) @name @item)]))))
 64
 65(program
 66    (lexical_declaration
 67        ["let" "const"] @context
 68        (variable_declarator
 69            name: (identifier) @name) @item))
 70
 71; Top-level array destructuring
 72(program
 73    (lexical_declaration
 74        ["let" "const"] @context
 75        (variable_declarator
 76            name: (array_pattern
 77                [
 78                    (identifier) @name @item
 79                    (assignment_pattern left: (identifier) @name @item)
 80                    (rest_pattern (identifier) @name @item)
 81                ]))))
 82
 83; Top-level object destructuring
 84(program
 85    (lexical_declaration
 86        ["let" "const"] @context
 87        (variable_declarator
 88            name: (object_pattern
 89                [(shorthand_property_identifier_pattern) @name @item
 90                 (pair_pattern
 91                     value: (identifier) @name @item)
 92                 (pair_pattern
 93                     value: (assignment_pattern left: (identifier) @name @item))
 94                 (rest_pattern (identifier) @name @item)]))))
 95
 96(class_declaration
 97    "class" @context
 98    name: (_) @name) @item
 99
100(abstract_class_declaration
101    "abstract" @context
102    "class" @context
103    name: (_) @name) @item
104
105; Method definitions in classes (not in object literals)
106(class_body
107    (method_definition
108        [
109            "get"
110            "set"
111            "async"
112            "*"
113            "readonly"
114            "static"
115            (override_modifier)
116            (accessibility_modifier)
117        ]* @context
118        name: (_) @name
119        parameters: (formal_parameters
120          "(" @context
121          ")" @context)) @item)
122
123; Object literal methods
124(variable_declarator
125    value: (object
126        (method_definition
127            [
128                "get"
129                "set"
130                "async"
131                "*"
132            ]* @context
133            name: (_) @name
134            parameters: (formal_parameters
135              "(" @context
136              ")" @context)) @item))
137
138(public_field_definition
139    [
140        "declare"
141        "readonly"
142        "abstract"
143        "static"
144        (accessibility_modifier)
145    ]* @context
146    name: (_) @name) @item
147
148; Add support for (node:test, bun:test and Jest) runnable
149(
150    (call_expression
151        function: [
152            (identifier) @_name
153            (member_expression
154                object: [
155                    (identifier) @_name
156                    (member_expression object: (identifier) @_name)
157                ]
158            )
159        ] @context
160        (#any-of? @_name "it" "test" "describe" "context" "suite")
161        arguments: (
162            arguments . [
163                (string (string_fragment) @name)
164                (identifier) @name
165            ]
166        )
167    )
168) @item
169
170; Add support for parameterized tests
171(
172    (call_expression
173        function: (call_expression
174            function: (member_expression
175                object: [(identifier) @_name (member_expression object: (identifier) @_name)]
176                property: (property_identifier) @_property
177            )
178            (#any-of? @_name "it" "test" "describe" "context" "suite")
179            (#any-of? @_property "each")
180        )
181        arguments: (
182            arguments . [
183                (string (string_fragment) @name)
184                (identifier) @name
185            ]
186        )
187    )
188) @item
189
190; Object properties
191(pair
192    key: [
193        (property_identifier) @name
194        (string (string_fragment) @name)
195        (number) @name
196        (computed_property_name) @name
197    ]) @item
198
199
200; Nested variables in function bodies
201(statement_block
202    (lexical_declaration
203        ["let" "const"] @context
204        (variable_declarator
205            name: (identifier) @name) @item))
206
207; Nested array destructuring in functions
208(statement_block
209    (lexical_declaration
210        ["let" "const"] @context
211        (variable_declarator
212            name: (array_pattern
213                [
214                    (identifier) @name @item
215                    (assignment_pattern left: (identifier) @name @item)
216                    (rest_pattern (identifier) @name @item)
217                ]))))
218
219; Nested object destructuring in functions
220(statement_block
221    (lexical_declaration
222        ["let" "const"] @context
223        (variable_declarator
224            name: (object_pattern
225                [(shorthand_property_identifier_pattern) @name @item
226                 (pair_pattern value: (identifier) @name @item)
227                 (pair_pattern value: (assignment_pattern left: (identifier) @name @item))
228                 (rest_pattern (identifier) @name @item)]))))
229
230(comment) @annotation