@@ -82,10 +82,11 @@ fn symbolReferencesInternal(
82
82
builder : * Builder ,
83
83
node : Ast.Node.Index ,
84
84
handle : * const DocumentStore.Handle ,
85
+ is_root : bool ,
85
86
) error {OutOfMemory }! void {
86
87
const tree = handle .tree ;
87
88
88
- if (node == 0 or node > tree .nodes .len ) return ;
89
+ if (! is_root and node == 0 or node > tree .nodes .len ) return ;
89
90
90
91
const node_tags = tree .nodes .items (.tag );
91
92
const datas = tree .nodes .items (.data );
@@ -102,7 +103,7 @@ fn symbolReferencesInternal(
102
103
const statements = ast .blockStatements (tree , node , & buffer ).? ;
103
104
104
105
for (statements ) | stmt |
105
- try symbolReferencesInternal (builder , stmt , handle );
106
+ try symbolReferencesInternal (builder , stmt , handle , false );
106
107
},
107
108
.container_decl ,
108
109
.container_decl_trailing ,
@@ -121,24 +122,24 @@ fn symbolReferencesInternal(
121
122
= > {
122
123
var buf : [2 ]Ast.Node.Index = undefined ;
123
124
for (ast .declMembers (tree , node , & buf )) | member |
124
- try symbolReferencesInternal (builder , member , handle );
125
+ try symbolReferencesInternal (builder , member , handle , false );
125
126
},
126
127
.global_var_decl ,
127
128
.local_var_decl ,
128
129
.simple_var_decl ,
129
130
.aligned_var_decl ,
130
131
= > {
131
132
const var_decl = ast .varDecl (tree , node ).? ;
132
- try symbolReferencesInternal (builder , var_decl .ast .type_node , handle );
133
- try symbolReferencesInternal (builder , var_decl .ast .init_node , handle );
133
+ try symbolReferencesInternal (builder , var_decl .ast .type_node , handle , false );
134
+ try symbolReferencesInternal (builder , var_decl .ast .init_node , handle , false );
134
135
},
135
136
.container_field ,
136
137
.container_field_align ,
137
138
.container_field_init ,
138
139
= > {
139
140
const field = ast .containerField (tree , node ).? ;
140
- try symbolReferencesInternal (builder , field .ast .type_expr , handle );
141
- try symbolReferencesInternal (builder , field .ast .value_expr , handle );
141
+ try symbolReferencesInternal (builder , field .ast .type_expr , handle , false );
142
+ try symbolReferencesInternal (builder , field .ast .value_expr , handle , false );
142
143
},
143
144
.identifier = > {
144
145
const child = (try analysis .lookupSymbolGlobal (builder .store , builder .arena , handle , tree .getNodeSource (node ), starts [main_tokens [node ]])) orelse return ;
@@ -154,43 +155,43 @@ fn symbolReferencesInternal(
154
155
const fn_proto = ast .fnProto (tree , node , & buf ).? ;
155
156
var it = fn_proto .iterate (& tree );
156
157
while (ast .nextFnParam (& it )) | param | {
157
- try symbolReferencesInternal (builder , param .type_expr , handle );
158
+ try symbolReferencesInternal (builder , param .type_expr , handle , false );
158
159
}
159
160
160
- try symbolReferencesInternal (builder , fn_proto .ast .return_type , handle );
161
- try symbolReferencesInternal (builder , fn_proto .ast .align_expr , handle );
162
- try symbolReferencesInternal (builder , fn_proto .ast .section_expr , handle );
163
- try symbolReferencesInternal (builder , fn_proto .ast .callconv_expr , handle );
161
+ try symbolReferencesInternal (builder , fn_proto .ast .return_type , handle , false );
162
+ try symbolReferencesInternal (builder , fn_proto .ast .align_expr , handle , false );
163
+ try symbolReferencesInternal (builder , fn_proto .ast .section_expr , handle , false );
164
+ try symbolReferencesInternal (builder , fn_proto .ast .callconv_expr , handle , false );
164
165
if (node_tags [node ] == .fn_decl ) {
165
- try symbolReferencesInternal (builder , datas [node ].rhs , handle );
166
+ try symbolReferencesInternal (builder , datas [node ].rhs , handle , false );
166
167
}
167
168
},
168
169
.@"switch" ,
169
170
.switch_comma ,
170
171
= > {
171
172
// TODO When renaming a union(enum) field, also rename switch items that refer to it.
172
- try symbolReferencesInternal (builder , datas [node ].lhs , handle );
173
+ try symbolReferencesInternal (builder , datas [node ].lhs , handle , false );
173
174
const extra = tree .extraData (datas [node ].rhs , Ast .Node .SubRange );
174
175
const cases = tree .extra_data [extra .start .. extra .end ];
175
176
for (cases ) | case | {
176
- try symbolReferencesInternal (builder , case , handle );
177
+ try symbolReferencesInternal (builder , case , handle , false );
177
178
}
178
179
},
179
180
.switch_case_one ,
180
181
.switch_case_inline_one ,
181
182
= > {
182
183
const case_one = tree .switchCaseOne (node );
183
- try symbolReferencesInternal (builder , case_one .ast .target_expr , handle );
184
+ try symbolReferencesInternal (builder , case_one .ast .target_expr , handle , false );
184
185
for (case_one .ast .values ) | val |
185
- try symbolReferencesInternal (builder , val , handle );
186
+ try symbolReferencesInternal (builder , val , handle , false );
186
187
},
187
188
.switch_case ,
188
189
.switch_case_inline ,
189
190
= > {
190
191
const case = tree .switchCase (node );
191
- try symbolReferencesInternal (builder , case .ast .target_expr , handle );
192
+ try symbolReferencesInternal (builder , case .ast .target_expr , handle , false );
192
193
for (case .ast .values ) | val |
193
- try symbolReferencesInternal (builder , val , handle );
194
+ try symbolReferencesInternal (builder , val , handle , false );
194
195
},
195
196
.@"while" ,
196
197
.while_simple ,
@@ -199,17 +200,17 @@ fn symbolReferencesInternal(
199
200
.@"for" ,
200
201
= > {
201
202
const loop = ast .whileAst (tree , node ).? ;
202
- try symbolReferencesInternal (builder , loop .ast .cond_expr , handle );
203
- try symbolReferencesInternal (builder , loop .ast .then_expr , handle );
204
- try symbolReferencesInternal (builder , loop .ast .else_expr , handle );
203
+ try symbolReferencesInternal (builder , loop .ast .cond_expr , handle , false );
204
+ try symbolReferencesInternal (builder , loop .ast .then_expr , handle , false );
205
+ try symbolReferencesInternal (builder , loop .ast .else_expr , handle , false );
205
206
},
206
207
.@"if" ,
207
208
.if_simple ,
208
209
= > {
209
210
const if_node = ast .ifFull (tree , node );
210
- try symbolReferencesInternal (builder , if_node .ast .cond_expr , handle );
211
- try symbolReferencesInternal (builder , if_node .ast .then_expr , handle );
212
- try symbolReferencesInternal (builder , if_node .ast .else_expr , handle );
211
+ try symbolReferencesInternal (builder , if_node .ast .cond_expr , handle , false );
212
+ try symbolReferencesInternal (builder , if_node .ast .then_expr , handle , false );
213
+ try symbolReferencesInternal (builder , if_node .ast .else_expr , handle , false );
213
214
},
214
215
.ptr_type ,
215
216
.ptr_type_aligned ,
@@ -219,15 +220,15 @@ fn symbolReferencesInternal(
219
220
const ptr_type = ast .ptrType (tree , node ).? ;
220
221
221
222
if (ptr_type .ast .align_node != 0 ) {
222
- try symbolReferencesInternal (builder , ptr_type .ast .align_node , handle );
223
+ try symbolReferencesInternal (builder , ptr_type .ast .align_node , handle , false );
223
224
if (node_tags [node ] == .ptr_type_bit_range ) {
224
- try symbolReferencesInternal (builder , ptr_type .ast .bit_range_start , handle );
225
- try symbolReferencesInternal (builder , ptr_type .ast .bit_range_end , handle );
225
+ try symbolReferencesInternal (builder , ptr_type .ast .bit_range_start , handle , false );
226
+ try symbolReferencesInternal (builder , ptr_type .ast .bit_range_end , handle , false );
226
227
}
227
228
}
228
229
229
- try symbolReferencesInternal (builder , ptr_type .ast .sentinel , handle );
230
- try symbolReferencesInternal (builder , ptr_type .ast .child_type , handle );
230
+ try symbolReferencesInternal (builder , ptr_type .ast .sentinel , handle , false );
231
+ try symbolReferencesInternal (builder , ptr_type .ast .child_type , handle , false );
231
232
},
232
233
.array_init ,
233
234
.array_init_comma ,
@@ -246,9 +247,9 @@ fn symbolReferencesInternal(
246
247
.array_init_dot_two , .array_init_dot_two_comma = > tree .arrayInitDotTwo (& buf , node ),
247
248
else = > unreachable ,
248
249
};
249
- try symbolReferencesInternal (builder , array_init .ast .type_expr , handle );
250
+ try symbolReferencesInternal (builder , array_init .ast .type_expr , handle , false );
250
251
for (array_init .ast .elements ) | e |
251
- try symbolReferencesInternal (builder , e , handle );
252
+ try symbolReferencesInternal (builder , e , handle , false );
252
253
},
253
254
.struct_init ,
254
255
.struct_init_comma ,
@@ -267,9 +268,9 @@ fn symbolReferencesInternal(
267
268
.struct_init_dot_two , .struct_init_dot_two_comma = > tree .structInitDotTwo (& buf , node ),
268
269
else = > unreachable ,
269
270
};
270
- try symbolReferencesInternal (builder , struct_init .ast .type_expr , handle );
271
+ try symbolReferencesInternal (builder , struct_init .ast .type_expr , handle , false );
271
272
for (struct_init .ast .fields ) | field |
272
- try symbolReferencesInternal (builder , field , handle );
273
+ try symbolReferencesInternal (builder , field , handle , false );
273
274
},
274
275
.call ,
275
276
.call_comma ,
@@ -283,10 +284,10 @@ fn symbolReferencesInternal(
283
284
var buf : [1 ]Ast.Node.Index = undefined ;
284
285
const call = ast .callFull (tree , node , & buf ).? ;
285
286
286
- try symbolReferencesInternal (builder , call .ast .fn_expr , handle );
287
+ try symbolReferencesInternal (builder , call .ast .fn_expr , handle , false );
287
288
288
289
for (call .ast .params ) | param | {
289
- try symbolReferencesInternal (builder , param , handle );
290
+ try symbolReferencesInternal (builder , param , handle , false );
290
291
}
291
292
},
292
293
.slice ,
@@ -300,10 +301,10 @@ fn symbolReferencesInternal(
300
301
else = > unreachable ,
301
302
};
302
303
303
- try symbolReferencesInternal (builder , slice .ast .sliced , handle );
304
- try symbolReferencesInternal (builder , slice .ast .start , handle );
305
- try symbolReferencesInternal (builder , slice .ast .end , handle );
306
- try symbolReferencesInternal (builder , slice .ast .sentinel , handle );
304
+ try symbolReferencesInternal (builder , slice .ast .sliced , handle , false );
305
+ try symbolReferencesInternal (builder , slice .ast .start , handle , false );
306
+ try symbolReferencesInternal (builder , slice .ast .end , handle , false );
307
+ try symbolReferencesInternal (builder , slice .ast .sentinel , handle , false );
307
308
},
308
309
.builtin_call ,
309
310
.builtin_call_comma ,
@@ -314,25 +315,26 @@ fn symbolReferencesInternal(
314
315
const params = ast .builtinCallParams (tree , node , & buffer ).? ;
315
316
316
317
for (params ) | param |
317
- try symbolReferencesInternal (builder , param , handle );
318
+ try symbolReferencesInternal (builder , param , handle , false );
318
319
},
319
320
.@"asm" ,
320
321
.asm_simple ,
321
322
= > | tag | {
322
323
const full_asm : Ast.full.Asm = if (tag == .@"asm" ) tree .asmFull (node ) else tree .asmSimple (node );
323
324
if (full_asm .ast .items .len == 0 )
324
- try symbolReferencesInternal (builder , full_asm .ast .template , handle );
325
+ try symbolReferencesInternal (builder , full_asm .ast .template , handle , false );
325
326
326
327
for (full_asm .inputs ) | input |
327
- try symbolReferencesInternal (builder , input , handle );
328
+ try symbolReferencesInternal (builder , input , handle , false );
328
329
329
330
for (full_asm .outputs ) | output |
330
- try symbolReferencesInternal (builder , output , handle );
331
+ try symbolReferencesInternal (builder , output , handle , false );
331
332
},
332
- .asm_output = > unreachable ,
333
- .asm_input = > unreachable ,
333
+ // TODO implement references for asm
334
+ .asm_output = > {},
335
+ .asm_input = > {},
334
336
.field_access = > {
335
- try symbolReferencesInternal (builder , datas [node ].lhs , handle );
337
+ try symbolReferencesInternal (builder , datas [node ].lhs , handle , false );
336
338
337
339
const rhs_str = ast .tokenSlice (tree , datas [node ].rhs ) catch return ;
338
340
var bound_type_params = analysis.BoundTypeParams {};
@@ -380,12 +382,12 @@ fn symbolReferencesInternal(
380
382
.grouped_expression ,
381
383
.@"comptime" ,
382
384
.@"nosuspend" ,
383
- = > try symbolReferencesInternal (builder , datas [node ].lhs , handle ),
385
+ = > try symbolReferencesInternal (builder , datas [node ].lhs , handle , false ),
384
386
.test_decl ,
385
387
.@"errdefer" ,
386
388
.@"defer" ,
387
389
.anyframe_type ,
388
- = > try symbolReferencesInternal (builder , datas [node ].rhs , handle ),
390
+ = > try symbolReferencesInternal (builder , datas [node ].rhs , handle , false ),
389
391
.equal_equal ,
390
392
.bang_equal ,
391
393
.less_than ,
@@ -440,8 +442,8 @@ fn symbolReferencesInternal(
440
442
.switch_range ,
441
443
.error_union ,
442
444
= > {
443
- try symbolReferencesInternal (builder , datas [node ].lhs , handle );
444
- try symbolReferencesInternal (builder , datas [node ].rhs , handle );
445
+ try symbolReferencesInternal (builder , datas [node ].lhs , handle , false );
446
+ try symbolReferencesInternal (builder , datas [node ].rhs , handle , false );
445
447
},
446
448
.anyframe_literal ,
447
449
.char_literal ,
@@ -472,15 +474,9 @@ pub fn symbolReferences(
472
474
if (include_decl ) try builder .add (curr_handle , decl_handle .nameToken ());
473
475
474
476
switch (decl_handle .decl .* ) {
475
- .pointer_payload ,
476
- .switch_payload ,
477
- .array_payload ,
478
- .array_index ,
479
- .ast_node ,
480
- = > {
481
- try symbolReferencesInternal (& builder , 0 , curr_handle );
477
+ .ast_node = > {
478
+ try symbolReferencesInternal (& builder , 0 , curr_handle , true );
482
479
483
- if (decl_handle .decl .* != .ast_node ) return builder .locations ;
484
480
if (! workspace ) return builder .locations ;
485
481
486
482
for (store .handles .values ()) | handle | {
@@ -494,10 +490,19 @@ pub fn symbolReferences(
494
490
495
491
for (dependencies .items ) | uri | {
496
492
const hdl = store .getHandle (uri ) orelse continue ;
497
- try symbolReferencesInternal (& builder , 0 , hdl );
493
+ try symbolReferencesInternal (& builder , 0 , hdl , true );
498
494
}
499
495
}
500
496
},
497
+ .pointer_payload ,
498
+ .switch_payload ,
499
+ .array_payload ,
500
+ .array_index ,
501
+ = > {
502
+ try symbolReferencesInternal (& builder , 0 , curr_handle , true );
503
+
504
+ return builder .locations ;
505
+ },
501
506
.param_payload = > | pay | blk : {
502
507
// Rename the param tok.
503
508
const param = pay .param ;
@@ -514,7 +519,7 @@ pub fn symbolReferences(
514
519
if (! std .meta .eql (candidate , param )) continue ;
515
520
516
521
if (curr_handle .tree .nodes .items (.tag )[proto ] != .fn_decl ) break :blk ;
517
- try symbolReferencesInternal (& builder , curr_handle .tree .nodes .items (.data )[proto ].rhs , curr_handle );
522
+ try symbolReferencesInternal (& builder , curr_handle .tree .nodes .items (.data )[proto ].rhs , curr_handle , false );
518
523
break :blk ;
519
524
}
520
525
}
0 commit comments