Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/moniker.rs')
| -rw-r--r-- | crates/ide/src/moniker.rs | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/crates/ide/src/moniker.rs b/crates/ide/src/moniker.rs index d97c12ebaf..66ea49a98a 100644 --- a/crates/ide/src/moniker.rs +++ b/crates/ide/src/moniker.rs @@ -289,7 +289,10 @@ fn def_to_non_local_moniker( definition: Definition, from_crate: Crate, ) -> Option<Moniker> { - let module = definition.module(db)?; + let module = match definition { + Definition::Module(module) if module.is_crate_root() => module, + _ => definition.module(db)?, + }; let krate = module.krate(); let edition = krate.edition(db); @@ -322,12 +325,18 @@ fn def_to_non_local_moniker( name: name.display(db, edition).to_string(), desc: def_to_kind(db, def).into(), }); - } else if reverse_description.is_empty() { - // Don't allow the last descriptor to be absent. - return None; } else { match def { - Definition::Module(module) if module.is_crate_root() => {} + Definition::Module(module) if module.is_crate_root() => { + // only include `crate` namespace by itself because we prefer + // `rust-analyzer cargo foo . bar/` over `rust-analyzer cargo foo . crate/bar/` + if reverse_description.is_empty() { + reverse_description.push(MonikerDescriptor { + name: "crate".to_owned(), + desc: MonikerDescriptorKind::Namespace, + }); + } + } _ => { tracing::error!(?def, "Encountered enclosing definition with no name"); } @@ -340,6 +349,9 @@ fn def_to_non_local_moniker( }; def = next_def; } + if reverse_description.is_empty() { + return None; + } reverse_description.reverse(); let description = reverse_description; |