Skip to content

Commit 994000b

Browse files
committed
Use method instead of a free function
1 parent e839d79 commit 994000b

File tree

2 files changed

+67
-65
lines changed

2 files changed

+67
-65
lines changed

crates/ra_ide/src/references.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ use crate::{display::TryToNav, FilePosition, FileRange, NavigationTarget, RangeI
2828

2929
pub(crate) use self::rename::rename;
3030

31-
pub use ra_ide_db::search::{
32-
find_refs_to_def, Reference, ReferenceAccess, ReferenceKind, SearchScope,
33-
};
31+
pub use ra_ide_db::search::{Reference, ReferenceAccess, ReferenceKind, SearchScope};
3432

3533
#[derive(Debug, Clone)]
3634
pub struct ReferenceSearchResult {
@@ -105,7 +103,8 @@ pub(crate) fn find_all_refs(
105103

106104
let RangeInfo { range, info: def } = find_name(&sema, &syntax, position, opt_name)?;
107105

108-
let references = find_refs_to_def(db, &def, search_scope)
106+
let references = def
107+
.find_usages(db, search_scope)
109108
.into_iter()
110109
.filter(|r| search_kind == ReferenceKind::Other || search_kind == r.kind)
111110
.collect();

crates/ra_ide_db/src/search.rs

Lines changed: 64 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -171,85 +171,88 @@ impl IntoIterator for SearchScope {
171171
}
172172
}
173173

174-
pub fn find_refs_to_def(
175-
db: &RootDatabase,
176-
def: &Definition,
177-
search_scope: Option<SearchScope>,
178-
) -> Vec<Reference> {
179-
let _p = profile("find_refs_to_def");
180-
181-
let search_scope = {
182-
let base = SearchScope::for_def(&def, db);
183-
match search_scope {
184-
None => base,
185-
Some(scope) => base.intersection(&scope),
186-
}
187-
};
174+
impl Definition {
175+
pub fn find_usages(
176+
&self,
177+
db: &RootDatabase,
178+
search_scope: Option<SearchScope>,
179+
) -> Vec<Reference> {
180+
let _p = profile("Definition::find_usages");
181+
182+
let search_scope = {
183+
let base = SearchScope::for_def(self, db);
184+
match search_scope {
185+
None => base,
186+
Some(scope) => base.intersection(&scope),
187+
}
188+
};
188189

189-
let name = match def.name(db) {
190-
None => return Vec::new(),
191-
Some(it) => it.to_string(),
192-
};
190+
let name = match self.name(db) {
191+
None => return Vec::new(),
192+
Some(it) => it.to_string(),
193+
};
193194

194-
let pat = name.as_str();
195-
let mut refs = vec![];
195+
let pat = name.as_str();
196+
let mut refs = vec![];
196197

197-
for (file_id, search_range) in search_scope {
198-
let text = db.file_text(file_id);
199-
let search_range =
200-
search_range.unwrap_or(TextRange::offset_len(0.into(), TextUnit::of_str(&text)));
198+
for (file_id, search_range) in search_scope {
199+
let text = db.file_text(file_id);
200+
let search_range =
201+
search_range.unwrap_or(TextRange::offset_len(0.into(), TextUnit::of_str(&text)));
201202

202-
let sema = Semantics::new(db);
203-
let tree = Lazy::new(|| sema.parse(file_id).syntax().clone());
203+
let sema = Semantics::new(db);
204+
let tree = Lazy::new(|| sema.parse(file_id).syntax().clone());
204205

205-
for (idx, _) in text.match_indices(pat) {
206-
let offset = TextUnit::from_usize(idx);
207-
if !search_range.contains_inclusive(offset) {
208-
// tested_by!(search_filters_by_range);
209-
continue;
210-
}
206+
for (idx, _) in text.match_indices(pat) {
207+
let offset = TextUnit::from_usize(idx);
208+
if !search_range.contains_inclusive(offset) {
209+
// tested_by!(search_filters_by_range);
210+
continue;
211+
}
211212

212-
let name_ref =
213-
if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(&tree, offset) {
214-
name_ref
215-
} else {
216-
// Handle macro token cases
217-
let token = match tree.token_at_offset(offset) {
218-
TokenAtOffset::None => continue,
219-
TokenAtOffset::Single(t) => t,
220-
TokenAtOffset::Between(_, t) => t,
213+
let name_ref =
214+
if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(&tree, offset) {
215+
name_ref
216+
} else {
217+
// Handle macro token cases
218+
let token = match tree.token_at_offset(offset) {
219+
TokenAtOffset::None => continue,
220+
TokenAtOffset::Single(t) => t,
221+
TokenAtOffset::Between(_, t) => t,
222+
};
223+
let expanded = sema.descend_into_macros(token);
224+
match ast::NameRef::cast(expanded.parent()) {
225+
Some(name_ref) => name_ref,
226+
_ => continue,
227+
}
221228
};
222-
let expanded = sema.descend_into_macros(token);
223-
match ast::NameRef::cast(expanded.parent()) {
224-
Some(name_ref) => name_ref,
225-
_ => continue,
226-
}
227-
};
228229

229-
// FIXME: reuse sb
230-
// See https://github.com/rust-lang/rust/pull/68198#issuecomment-574269098
230+
// FIXME: reuse sb
231+
// See https://github.com/rust-lang/rust/pull/68198#issuecomment-574269098
231232

232-
if let Some(d) = classify_name_ref(&sema, &name_ref) {
233-
let d = d.definition();
234-
if &d == def {
235-
let kind =
236-
if is_record_lit_name_ref(&name_ref) || is_call_expr_name_ref(&name_ref) {
233+
if let Some(d) = classify_name_ref(&sema, &name_ref) {
234+
let d = d.definition();
235+
if &d == self {
236+
let kind = if is_record_lit_name_ref(&name_ref)
237+
|| is_call_expr_name_ref(&name_ref)
238+
{
237239
ReferenceKind::StructLiteral
238240
} else {
239241
ReferenceKind::Other
240242
};
241243

242-
let file_range = sema.original_range(name_ref.syntax());
243-
refs.push(Reference {
244-
file_range,
245-
kind,
246-
access: reference_access(&d, &name_ref),
247-
});
244+
let file_range = sema.original_range(name_ref.syntax());
245+
refs.push(Reference {
246+
file_range,
247+
kind,
248+
access: reference_access(&d, &name_ref),
249+
});
250+
}
248251
}
249252
}
250253
}
254+
refs
251255
}
252-
refs
253256
}
254257

255258
fn reference_access(def: &Definition, name_ref: &ast::NameRef) -> Option<ReferenceAccess> {

0 commit comments

Comments
 (0)