about summary refs log tree commit diff
diff options
context:
space:
mode:
authorrainy-me <github@yue.coffee>2021-12-19 01:51:51 +0900
committerrainy-me <github@yue.coffee>2021-12-19 01:51:51 +0900
commit67cc6c1e169ad5a877b7982ca768be0d9d7af3f7 (patch)
tree9182184d3b71575f8fcfc3c514d22bb85bb8cde9
parent9f1a3ae5ab46132de350147753443be2ba87a756 (diff)
downloadrust-67cc6c1e169ad5a877b7982ca768be0d9d7af3f7.tar.gz
rust-67cc6c1e169ad5a877b7982ca768be0d9d7af3f7.zip
feat: treat fn keyword inside function pointer type as primitive
-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 c493e3e2fb2..b0edec56ff1 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 28dd2afa02a..19a0e2c2610 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#"