Unnamed repository; edit this file 'description' to name the repository.
Merge #11552
11552: fix: properly display `$crate` in hovers r=jonas-schievink a=jonas-schievink We used to print it as `{extern_crate}`, this PR resolves it to the crate's name, or falls back to `$crate` if the crate has no name. bors r+ Co-authored-by: Jonas Schievink <[email protected]>
bors[bot] 2022-02-26
parent ab896e3 · parent a247fff · commit e1541bd
-rw-r--r--crates/hir_ty/src/display.rs13
-rw-r--r--crates/ide/src/hover/tests.rs30
2 files changed, 42 insertions, 1 deletions
diff --git a/crates/hir_ty/src/display.rs b/crates/hir_ty/src/display.rs
index 0e75ddeabc..2020834fbc 100644
--- a/crates/hir_ty/src/display.rs
+++ b/crates/hir_ty/src/display.rs
@@ -1189,7 +1189,18 @@ impl HirDisplay for Path {
write!(f, "super")?;
}
}
- (_, PathKind::DollarCrate(_)) => write!(f, "{{extern_crate}}")?,
+ (_, PathKind::DollarCrate(id)) => {
+ // Resolve `$crate` to the crate's display name.
+ // FIXME: should use the dependency name instead if available, but that depends on
+ // the crate invoking `HirDisplay`
+ let crate_graph = f.db.crate_graph();
+ let name = crate_graph[*id]
+ .display_name
+ .as_ref()
+ .map(|name| name.canonical_name())
+ .unwrap_or("$crate");
+ write!(f, "{name}")?
+ }
}
for (seg_idx, segment) in self.segments().iter().enumerate() {
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index a232ebd4fb..df0ca941c9 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -4583,3 +4583,33 @@ pub struct Foo;
"##]],
);
}
+
+#[test]
+fn hover_dollar_crate() {
+ // $crate should be resolved to the right crate name.
+
+ check(
+ r#"
+//- /main.rs crate:main deps:dep
+dep::m!(KONST$0);
+//- /dep.rs crate:dep
+#[macro_export]
+macro_rules! m {
+ ( $name:ident ) => { const $name: $crate::Type = $crate::Type; };
+}
+
+pub struct Type;
+"#,
+ expect![[r#"
+ *KONST*
+
+ ```rust
+ main
+ ```
+
+ ```rust
+ const KONST: dep::Type = $crate::Type
+ ```
+ "#]],
+ );
+}