diff options
Diffstat (limited to 'crates/ra_ide/src/goto_definition.rs')
-rw-r--r-- | crates/ra_ide/src/goto_definition.rs | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/crates/ra_ide/src/goto_definition.rs b/crates/ra_ide/src/goto_definition.rs index 4e3f428fa..b44b6fe22 100644 --- a/crates/ra_ide/src/goto_definition.rs +++ b/crates/ra_ide/src/goto_definition.rs | |||
@@ -1,6 +1,6 @@ | |||
1 | use hir::Semantics; | 1 | use hir::Semantics; |
2 | use ra_ide_db::{ | 2 | use ra_ide_db::{ |
3 | defs::{classify_name, classify_name_ref, NameClass}, | 3 | defs::{classify_name, classify_name_ref}, |
4 | symbol_index, RootDatabase, | 4 | symbol_index, RootDatabase, |
5 | }; | 5 | }; |
6 | use ra_syntax::{ | 6 | use ra_syntax::{ |
@@ -40,10 +40,7 @@ pub(crate) fn goto_definition( | |||
40 | reference_definition(&sema, &name_ref).to_vec() | 40 | reference_definition(&sema, &name_ref).to_vec() |
41 | }, | 41 | }, |
42 | ast::Name(name) => { | 42 | ast::Name(name) => { |
43 | let def = match classify_name(&sema, &name)? { | 43 | let def = classify_name(&sema, &name)?.definition(sema.db)?; |
44 | NameClass::Definition(def) | NameClass::ConstReference(def) => def, | ||
45 | NameClass::FieldShorthand { local: _, field } => field, | ||
46 | }; | ||
47 | let nav = def.try_to_nav(sema.db)?; | 44 | let nav = def.try_to_nav(sema.db)?; |
48 | vec![nav] | 45 | vec![nav] |
49 | }, | 46 | }, |
@@ -85,9 +82,7 @@ pub(crate) fn reference_definition( | |||
85 | name_ref: &ast::NameRef, | 82 | name_ref: &ast::NameRef, |
86 | ) -> ReferenceResult { | 83 | ) -> ReferenceResult { |
87 | let name_kind = classify_name_ref(sema, name_ref); | 84 | let name_kind = classify_name_ref(sema, name_ref); |
88 | if let Some(def) = name_kind { | 85 | if let Some(def) = name_kind.and_then(|def| def.definition(sema.db)) { |
89 | let def = def.definition(); | ||
90 | |||
91 | return match def.try_to_nav(sema.db) { | 86 | return match def.try_to_nav(sema.db) { |
92 | Some(nav) => ReferenceResult::Exact(nav), | 87 | Some(nav) => ReferenceResult::Exact(nav), |
93 | None => ReferenceResult::Approximate(Vec::new()), | 88 | None => ReferenceResult::Approximate(Vec::new()), |
@@ -134,6 +129,32 @@ mod tests { | |||
134 | } | 129 | } |
135 | 130 | ||
136 | #[test] | 131 | #[test] |
132 | fn goto_def_for_extern_crate() { | ||
133 | check( | ||
134 | r#" | ||
135 | //- /main.rs | ||
136 | extern crate std<|>; | ||
137 | //- /std/lib.rs | ||
138 | // empty | ||
139 | //^ file | ||
140 | "#, | ||
141 | ) | ||
142 | } | ||
143 | |||
144 | #[test] | ||
145 | fn goto_def_for_renamed_extern_crate() { | ||
146 | check( | ||
147 | r#" | ||
148 | //- /main.rs | ||
149 | extern crate std as abc<|>; | ||
150 | //- /std/lib.rs | ||
151 | // empty | ||
152 | //^ file | ||
153 | "#, | ||
154 | ) | ||
155 | } | ||
156 | |||
157 | #[test] | ||
137 | fn goto_def_in_items() { | 158 | fn goto_def_in_items() { |
138 | check( | 159 | check( |
139 | r#" | 160 | r#" |