1; Functions names start with `Test`
2(
3 [
4 (function_declaration name: (_) @run
5 (#match? @run "^Test.*"))
6 (method_declaration
7 receiver: (parameter_list
8 (parameter_declaration
9 name: (identifier) @_receiver_name
10 type: [
11 (pointer_type (type_identifier) @_receiver_type)
12 (type_identifier) @_receiver_type
13 ]
14 )
15 )
16 name: (field_identifier) @run @_method_name
17 (#match? @_method_name "^Test.*"))
18 ] @_
19 (#set! tag go-test)
20)
21
22; `go:generate` comments
23(
24 ((comment) @_comment @run
25 (#match? @_comment "^//go:generate"))
26 (#set! tag go-generate)
27)
28
29; `t.Run`
30(
31 (
32 (call_expression
33 function: (
34 selector_expression
35 field: _ @run @_name
36 (#eq? @_name "Run")
37 )
38 arguments: (
39 argument_list
40 .
41 [
42 (interpreted_string_literal)
43 (raw_string_literal)
44 ] @_subtest_name
45 .
46 (func_literal
47 parameters: (
48 parameter_list
49 (parameter_declaration
50 name: (identifier) @_param_name
51 type: (pointer_type
52 (qualified_type
53 package: (package_identifier) @_pkg
54 name: (type_identifier) @_type
55 (#eq? @_pkg "testing")
56 (#eq? @_type "T")
57 )
58 )
59 )
60 )
61 ) @_second_argument
62 )
63 )
64 ) @_
65 (#set! tag go-subtest)
66)
67
68; Functions names start with `Benchmark`
69(
70 (
71 (function_declaration name: (_) @run @_name
72 (#match? @_name "^Benchmark.*"))
73 ) @_
74 (#set! tag go-benchmark)
75)
76
77; Functions names start with `Fuzz`
78(
79 (
80 (function_declaration name: (_) @run @_name
81 (#match? @_name "^Fuzz"))
82 ) @_
83 (#set! tag go-fuzz)
84)
85
86; go run
87(
88 (
89 (function_declaration name: (_) @run
90 (#eq? @run "main"))
91 ) @_
92 (#set! tag go-main)
93)
94
95; Table test cases - slice and map
96(
97 (short_var_declaration
98 left: (expression_list (identifier) @_collection_var)
99 right: (expression_list
100 (composite_literal
101 type: [
102 (slice_type)
103 (map_type
104 key: (type_identifier) @_key_type
105 (#eq? @_key_type "string")
106 )
107 ]
108 body: (literal_value
109 [
110 (literal_element
111 (literal_value
112 (keyed_element
113 (literal_element
114 (identifier) @_field_name
115 )
116 (literal_element
117 [
118 (interpreted_string_literal) @run @_table_test_case_name
119 (raw_string_literal) @run @_table_test_case_name
120 ]
121 )
122 )
123 )
124 )
125 (keyed_element
126 (literal_element
127 [
128 (interpreted_string_literal) @run @_table_test_case_name
129 (raw_string_literal) @run @_table_test_case_name
130 ]
131 )
132 )
133 ]
134 )
135 )
136 )
137 )
138 (for_statement
139 (range_clause
140 left: (expression_list
141 [
142 (
143 (identifier)
144 (identifier) @_loop_var
145 )
146 (identifier) @_loop_var
147 ]
148 )
149 right: (identifier) @_range_var
150 (#eq? @_range_var @_collection_var)
151 )
152 body: (block
153 (expression_statement
154 (call_expression
155 function: (selector_expression
156 operand: (identifier) @_t_var
157 field: (field_identifier) @_run_method
158 (#eq? @_run_method "Run")
159 )
160 arguments: (argument_list
161 .
162 [
163 (selector_expression
164 operand: (identifier) @_tc_var
165 (#eq? @_tc_var @_loop_var)
166 field: (field_identifier) @_field_check
167 (#eq? @_field_check @_field_name)
168 )
169 (identifier) @_arg_var
170 (#eq? @_arg_var @_loop_var)
171 ]
172 .
173 (func_literal
174 parameters: (parameter_list
175 (parameter_declaration
176 type: (pointer_type
177 (qualified_type
178 package: (package_identifier) @_pkg
179 name: (type_identifier) @_type
180 (#eq? @_pkg "testing")
181 (#eq? @_type "T")
182 )
183 )
184 )
185 )
186 )
187 )
188 )
189 )
190 )
191 ) @_
192 (#set! tag go-table-test-case)
193)