Skip to content

Commit 844e1aa

Browse files
bors[bot]matklad
andauthored
Merge #5824
5824: Optimize reference search r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 5dafd39 + e262149 commit 844e1aa

File tree

1 file changed

+38
-25
lines changed

1 file changed

+38
-25
lines changed

crates/ide_db/src/search.rs

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,25 @@ impl<'a> FindUsages<'a> {
203203
}
204204

205205
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
207212
}
208213

209214
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");
211225
let sema = self.sema;
212226

213227
let search_scope = {
@@ -219,13 +233,11 @@ impl<'a> FindUsages<'a> {
219233
};
220234

221235
let name = match self.def.name(sema.db) {
222-
None => return Vec::new(),
223236
Some(it) => it.to_string(),
237+
None => return,
224238
};
225239

226240
let pat = name.as_str();
227-
let mut refs = vec![];
228-
229241
for (file_id, search_range) in search_scope {
230242
let text = sema.db.file_text(file_id);
231243
let search_range =
@@ -240,10 +252,9 @@ impl<'a> FindUsages<'a> {
240252
}
241253

242254
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,
247258
};
248259

249260
match classify_name_ref(&sema, &name_ref) {
@@ -256,43 +267,45 @@ impl<'a> FindUsages<'a> {
256267
ReferenceKind::Other
257268
};
258269

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()),
262272
kind,
263273
access: reference_access(&def, &name_ref),
264-
});
274+
};
275+
if sink(reference) {
276+
return;
277+
}
265278
}
266279
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 {
269282
file_range: self.sema.original_range(name_ref.syntax()),
270283
kind: ReferenceKind::FieldShorthandForField,
271284
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 {
274287
file_range: self.sema.original_range(name_ref.syntax()),
275288
kind: ReferenceKind::FieldShorthandForLocal,
276289
access: reference_access(&Definition::Local(local), &name_ref),
277-
}),
278-
279-
_ => {} // not a usage
290+
},
291+
_ => continue, // not a usage
280292
};
293+
if sink(reference) {
294+
return;
295+
}
281296
}
282297
_ => {} // not a usage
283298
}
284299
}
285300
}
286-
refs
287301
}
288302
}
289303

290304
fn reference_access(def: &Definition, name_ref: &ast::NameRef) -> Option<ReferenceAccess> {
291305
// 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+
}
296309

297310
let mode = name_ref.syntax().ancestors().find_map(|node| {
298311
match_ast! {

0 commit comments

Comments
 (0)