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.rs22
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;