aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_def')
-rw-r--r--crates/ra_hir_def/src/find_path.rs20
1 files changed, 20 insertions, 0 deletions
diff --git a/crates/ra_hir_def/src/find_path.rs b/crates/ra_hir_def/src/find_path.rs
index 166728153..69cdfc943 100644
--- a/crates/ra_hir_def/src/find_path.rs
+++ b/crates/ra_hir_def/src/find_path.rs
@@ -11,6 +11,10 @@ use hir_expand::name::Name;
11 11
12const MAX_PATH_LEN: usize = 15; 12const MAX_PATH_LEN: usize = 15;
13 13
14// FIXME: handle local items
15
16/// Find a path that can be used to refer to a certain item. This can depend on
17/// *from where* you're referring to the item, hence the `from` parameter.
14pub fn find_path(db: &impl DefDatabase, item: ItemInNs, from: ModuleId) -> Option<ModPath> { 18pub fn find_path(db: &impl DefDatabase, item: ItemInNs, from: ModuleId) -> Option<ModPath> {
15 find_path_inner(db, item, from, MAX_PATH_LEN) 19 find_path_inner(db, item, from, MAX_PATH_LEN)
16} 20}
@@ -44,6 +48,11 @@ fn find_path_inner(
44 return Some(ModPath::from_simple_segments(PathKind::Crate, Vec::new())); 48 return Some(ModPath::from_simple_segments(PathKind::Crate, Vec::new()));
45 } 49 }
46 50
51 // - if the item is the module we're in, use `self`
52 if item == ItemInNs::Types(from.into()) {
53 return Some(ModPath::from_simple_segments(PathKind::Super(0), Vec::new()));
54 }
55
47 // - if the item is the parent module, use `super` (this is not used recursively, since `super::super` is ugly) 56 // - if the item is the parent module, use `super` (this is not used recursively, since `super::super` is ugly)
48 if let Some(parent_id) = def_map.modules[from.local_id].parent { 57 if let Some(parent_id) = def_map.modules[from.local_id].parent {
49 if item 58 if item
@@ -272,6 +281,17 @@ mod tests {
272 } 281 }
273 282
274 #[test] 283 #[test]
284 fn self_module() {
285 let code = r#"
286 //- /main.rs
287 mod foo;
288 //- /foo.rs
289 <|>
290 "#;
291 check_found_path(code, "self");
292 }
293
294 #[test]
275 fn crate_root() { 295 fn crate_root() {
276 let code = r#" 296 let code = r#"
277 //- /main.rs 297 //- /main.rs