@@ -203,11 +203,25 @@ impl<'a> FindUsages<'a> {
203
203
}
204
204
205
205
pub fn at_least_one ( self ) -> bool {
206
- !self . all ( ) . is_empty ( )
206
+ let mut found = false ;
207
+ self . search ( & mut |_reference| {
208
+ found = true ;
209
+ true
210
+ } ) ;
211
+ found
207
212
}
208
213
209
214
pub fn all ( self ) -> Vec < Reference > {
210
- let _p = profile:: span ( "Definition::find_usages" ) ;
215
+ let mut res = Vec :: new ( ) ;
216
+ self . search ( & mut |reference| {
217
+ res. push ( reference) ;
218
+ false
219
+ } ) ;
220
+ res
221
+ }
222
+
223
+ fn search ( self , sink : & mut dyn FnMut ( Reference ) -> bool ) {
224
+ let _p = profile:: span ( "FindUsages:search" ) ;
211
225
let sema = self . sema ;
212
226
213
227
let search_scope = {
@@ -219,13 +233,11 @@ impl<'a> FindUsages<'a> {
219
233
} ;
220
234
221
235
let name = match self . def . name ( sema. db ) {
222
- None => return Vec :: new ( ) ,
223
236
Some ( it) => it. to_string ( ) ,
237
+ None => return ,
224
238
} ;
225
239
226
240
let pat = name. as_str ( ) ;
227
- let mut refs = vec ! [ ] ;
228
-
229
241
for ( file_id, search_range) in search_scope {
230
242
let text = sema. db . file_text ( file_id) ;
231
243
let search_range =
@@ -240,10 +252,9 @@ impl<'a> FindUsages<'a> {
240
252
}
241
253
242
254
let name_ref: ast:: NameRef =
243
- if let Some ( name_ref) = sema. find_node_at_offset_with_descend ( & tree, offset) {
244
- name_ref
245
- } else {
246
- continue ;
255
+ match sema. find_node_at_offset_with_descend ( & tree, offset) {
256
+ Some ( it) => it,
257
+ None => continue ,
247
258
} ;
248
259
249
260
match classify_name_ref ( & sema, & name_ref) {
@@ -256,43 +267,45 @@ impl<'a> FindUsages<'a> {
256
267
ReferenceKind :: Other
257
268
} ;
258
269
259
- let file_range = sema. original_range ( name_ref. syntax ( ) ) ;
260
- refs. push ( Reference {
261
- file_range,
270
+ let reference = Reference {
271
+ file_range : sema. original_range ( name_ref. syntax ( ) ) ,
262
272
kind,
263
273
access : reference_access ( & def, & name_ref) ,
264
- } ) ;
274
+ } ;
275
+ if sink ( reference) {
276
+ return ;
277
+ }
265
278
}
266
279
Some ( NameRefClass :: FieldShorthand { local, field } ) => {
267
- match self . def {
268
- Definition :: Field ( _) if & field == self . def => refs . push ( Reference {
280
+ let reference = match self . def {
281
+ Definition :: Field ( _) if & field == self . def => Reference {
269
282
file_range : self . sema . original_range ( name_ref. syntax ( ) ) ,
270
283
kind : ReferenceKind :: FieldShorthandForField ,
271
284
access : reference_access ( & field, & name_ref) ,
272
- } ) ,
273
- Definition :: Local ( l) if & local == l => refs . push ( Reference {
285
+ } ,
286
+ Definition :: Local ( l) if & local == l => Reference {
274
287
file_range : self . sema . original_range ( name_ref. syntax ( ) ) ,
275
288
kind : ReferenceKind :: FieldShorthandForLocal ,
276
289
access : reference_access ( & Definition :: Local ( local) , & name_ref) ,
277
- } ) ,
278
-
279
- _ => { } // not a usage
290
+ } ,
291
+ _ => continue , // not a usage
280
292
} ;
293
+ if sink ( reference) {
294
+ return ;
295
+ }
281
296
}
282
297
_ => { } // not a usage
283
298
}
284
299
}
285
300
}
286
- refs
287
301
}
288
302
}
289
303
290
304
fn reference_access ( def : & Definition , name_ref : & ast:: NameRef ) -> Option < ReferenceAccess > {
291
305
// Only Locals and Fields have accesses for now.
292
- match def {
293
- Definition :: Local ( _) | Definition :: Field ( _) => { }
294
- _ => return None ,
295
- } ;
306
+ if !matches ! ( def, Definition :: Local ( _) | Definition :: Field ( _) ) {
307
+ return None ;
308
+ }
296
309
297
310
let mode = name_ref. syntax ( ) . ancestors ( ) . find_map ( |node| {
298
311
match_ast ! {
0 commit comments