From 67cc6c1e169ad5a877b7982ca768be0d9d7af3f7 Mon Sep 17 00:00:00 2001 From: rainy-me Date: Sun, 19 Dec 2021 01:51:51 +0900 Subject: [PATCH] feat: treat fn keyword inside function pointer type as primitive --- crates/ide/src/hover/render.rs | 12 +++++++++--- crates/ide/src/hover/tests.rs | 24 ++++++++++++++++++++++++ 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 @@ -3382,6 +3382,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(