Skip to content

Commit 177229b

Browse files
committed
Move reference classification to ra_ide_db
Lost some marks along the way :-(
1 parent 34d6e22 commit 177229b

File tree

5 files changed

+77
-104
lines changed

5 files changed

+77
-104
lines changed

crates/ra_ide/src/goto_definition.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,6 @@ mod tests {
206206

207207
#[test]
208208
fn goto_def_for_macros() {
209-
covers!(goto_def_for_macros);
210209
check_goto(
211210
"
212211
//- /lib.rs
@@ -223,7 +222,6 @@ mod tests {
223222

224223
#[test]
225224
fn goto_def_for_macros_from_other_crates() {
226-
covers!(goto_def_for_macros);
227225
check_goto(
228226
"
229227
//- /lib.rs
@@ -335,7 +333,6 @@ mod tests {
335333

336334
#[test]
337335
fn goto_def_for_methods() {
338-
covers!(goto_def_for_methods);
339336
check_goto(
340337
"
341338
//- /lib.rs
@@ -355,7 +352,6 @@ mod tests {
355352

356353
#[test]
357354
fn goto_def_for_fields() {
358-
covers!(goto_def_for_fields);
359355
check_goto(
360356
"
361357
//- /lib.rs
@@ -374,7 +370,6 @@ mod tests {
374370

375371
#[test]
376372
fn goto_def_for_record_fields() {
377-
covers!(goto_def_for_record_fields);
378373
check_goto(
379374
"
380375
//- /lib.rs
@@ -787,7 +782,6 @@ mod tests {
787782

788783
#[test]
789784
fn goto_def_for_field_init_shorthand() {
790-
covers!(goto_def_for_field_init_shorthand);
791785
check_goto(
792786
"
793787
//- /lib.rs

crates/ra_ide/src/marks.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,6 @@
33
test_utils::marks!(
44
inserts_angle_brackets_for_generics
55
inserts_parens_for_function_calls
6-
goto_def_for_macros
7-
goto_def_for_methods
8-
goto_def_for_fields
9-
goto_def_for_record_fields
10-
goto_def_for_field_init_shorthand
116
call_info_bad_offset
127
dont_complete_current_use
138
test_resolve_parent_module_on_module_decl

crates/ra_ide/src/references.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
//! at the index that the match starts at and its tree parent is
1010
//! resolved to the search element definition, we get a reference.
1111
12-
mod classify;
1312
mod rename;
1413
mod search_scope;
1514

@@ -27,11 +26,8 @@ use test_utils::tested_by;
2726

2827
use crate::{display::TryToNav, FilePosition, FileRange, NavigationTarget, RangeInfo};
2928

30-
pub(crate) use self::{
31-
classify::{classify_name_ref, NameRefClass},
32-
rename::rename,
33-
};
34-
pub(crate) use ra_ide_db::defs::{classify_name, Definition};
29+
pub(crate) use self::rename::rename;
30+
pub(crate) use ra_ide_db::defs::{classify_name, classify_name_ref, Definition, NameRefClass};
3531

3632
pub use self::search_scope::SearchScope;
3733

crates/ra_ide/src/references/classify.rs

Lines changed: 0 additions & 84 deletions
This file was deleted.

crates/ra_ide_db/src/defs.rs

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
// FIXME: this badly needs rename/rewrite (matklad, 2020-02-06).
77

88
use hir::{
9-
Adt, FieldSource, HasSource, ImplDef, Local, MacroDef, Module, ModuleDef, Name, Semantics,
10-
StructField, TypeParam,
9+
Adt, FieldSource, HasSource, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution,
10+
Semantics, StructField, TypeParam,
1111
};
1212
use ra_prof::profile;
1313
use ra_syntax::{
@@ -117,6 +117,8 @@ impl NameClass {
117117
}
118118

119119
pub fn classify_name(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option<NameClass> {
120+
let _p = profile("classify_name");
121+
120122
if let Some(bind_pat) = name.syntax().parent().and_then(ast::BindPat::cast) {
121123
if let Some(def) = sema.resolve_bind_pat_to_const(&bind_pat) {
122124
return Some(NameClass::ConstReference(Definition::ModuleDef(def)));
@@ -127,7 +129,6 @@ pub fn classify_name(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option
127129
}
128130

129131
fn classify_name_inner(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option<Definition> {
130-
let _p = profile("classify_name");
131132
let parent = name.syntax().parent()?;
132133

133134
match_ast! {
@@ -192,3 +193,74 @@ fn classify_name_inner(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Opti
192193
}
193194
}
194195
}
196+
197+
pub enum NameRefClass {
198+
Definition(Definition),
199+
FieldShorthand { local: Local, field: Definition },
200+
}
201+
202+
impl NameRefClass {
203+
pub fn definition(self) -> Definition {
204+
match self {
205+
NameRefClass::Definition(def) => def,
206+
NameRefClass::FieldShorthand { local, field: _ } => Definition::Local(local),
207+
}
208+
}
209+
}
210+
211+
pub fn classify_name_ref(
212+
sema: &Semantics<RootDatabase>,
213+
name_ref: &ast::NameRef,
214+
) -> Option<NameRefClass> {
215+
let _p = profile("classify_name_ref");
216+
217+
let parent = name_ref.syntax().parent()?;
218+
219+
if let Some(method_call) = ast::MethodCallExpr::cast(parent.clone()) {
220+
if let Some(func) = sema.resolve_method_call(&method_call) {
221+
return Some(NameRefClass::Definition(Definition::ModuleDef(func.into())));
222+
}
223+
}
224+
225+
if let Some(field_expr) = ast::FieldExpr::cast(parent.clone()) {
226+
if let Some(field) = sema.resolve_field(&field_expr) {
227+
return Some(NameRefClass::Definition(Definition::StructField(field)));
228+
}
229+
}
230+
231+
if let Some(record_field) = ast::RecordField::cast(parent.clone()) {
232+
if let Some((field, local)) = sema.resolve_record_field(&record_field) {
233+
let field = Definition::StructField(field);
234+
let res = match local {
235+
None => NameRefClass::Definition(field),
236+
Some(local) => NameRefClass::FieldShorthand { field, local },
237+
};
238+
return Some(res);
239+
}
240+
}
241+
242+
if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) {
243+
if let Some(macro_def) = sema.resolve_macro_call(&macro_call) {
244+
return Some(NameRefClass::Definition(Definition::Macro(macro_def)));
245+
}
246+
}
247+
248+
let path = name_ref.syntax().ancestors().find_map(ast::Path::cast)?;
249+
let resolved = sema.resolve_path(&path)?;
250+
let res = match resolved {
251+
PathResolution::Def(def) => Definition::ModuleDef(def),
252+
PathResolution::AssocItem(item) => {
253+
let def = match item {
254+
hir::AssocItem::Function(it) => it.into(),
255+
hir::AssocItem::Const(it) => it.into(),
256+
hir::AssocItem::TypeAlias(it) => it.into(),
257+
};
258+
Definition::ModuleDef(def)
259+
}
260+
PathResolution::Local(local) => Definition::Local(local),
261+
PathResolution::TypeParam(par) => Definition::TypeParam(par),
262+
PathResolution::Macro(def) => Definition::Macro(def),
263+
PathResolution::SelfType(impl_def) => Definition::SelfType(impl_def),
264+
};
265+
Some(NameRefClass::Definition(res))
266+
}

0 commit comments

Comments
 (0)