Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide/src/hover/render.rs12
-rw-r--r--crates/ide/src/hover/tests.rs24
2 files changed, 33 insertions, 3 deletions
diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs
index c493e3e2fb..b0edec56ff 100644
--- a/crates/ide/src/hover/render.rs
+++ b/crates/ide/src/hover/render.rs
@@ -237,9 +237,15 @@ pub(super) fn keyword(
if !token.kind().is_keyword() || !config.documentation.is_some() {
return None;
}
- let famous_defs = FamousDefs(sema, sema.scope(&token.parent()?).krate());
- // std exposes {}_keyword modules with docstrings on the root to document keywords
- let keyword_mod = format!("{}_keyword", token.text());
+ let parent = token.parent()?;
+ let famous_defs = FamousDefs(sema, sema.scope(&parent).krate());
+ let keyword_mod = if token.kind() == T![fn] && ast::FnPtrType::cast(parent).is_some() {
+ // treat fn keyword inside function pointer type as primitive
+ format!("prim_{}", token.text())
+ } else {
+ // std exposes {}_keyword modules with docstrings on the root to document keywords
+ format!("{}_keyword", token.text())
+ };
let doc_owner = find_std_module(&famous_defs, &keyword_mod)?;
let docs = doc_owner.attrs(sema.db).docs()?;
let markup = process_markup(
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index 28dd2afa02..19a0e2c261 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -3383,6 +3383,30 @@ mod return_keyword {}
}
#[test]
+fn hover_keyword_as_primitive() {
+ check(
+ r#"
+//- /main.rs crate:main deps:std
+type F = f$0n(i32) -> i32;
+//- /libstd.rs crate:std
+/// Docs for prim_fn
+mod prim_fn {}
+"#,
+ expect![[r#"
+ *fn*
+
+ ```rust
+ fn
+ ```
+
+ ---
+
+ Docs for prim_fn
+ "#]],
+ );
+}
+
+#[test]
fn hover_builtin() {
check(
r#"