Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/hover/render.rs')
| -rw-r--r-- | crates/ide/src/hover/render.rs | 52 |
1 files changed, 27 insertions, 25 deletions
diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs index 5bdfb57356..a1eff3aaee 100644 --- a/crates/ide/src/hover/render.rs +++ b/crates/ide/src/hover/render.rs @@ -1,5 +1,5 @@ //! Logic for rendering the different hover messages -use std::{borrow::Cow, env, mem, ops::Not}; +use std::{env, mem, ops::Not}; use either::Either; use hir::{ @@ -11,7 +11,7 @@ use hir::{ use ide_db::{ RootDatabase, defs::{Definition, find_std_module}, - documentation::{Documentation, HasDocs}, + documentation::{DocsRangeMap, HasDocs}, famous_defs::FamousDefs, generated::lints::{CLIPPY_LINTS, DEFAULT_LINTS, FEATURES}, syntax_helpers::prettify_macro_expansion, @@ -278,9 +278,9 @@ pub(super) fn keyword( keyword_hints(sema, token, parent, edition, display_target); let doc_owner = find_std_module(&famous_defs, &keyword_mod, edition)?; - let docs = doc_owner.docs_with_rangemap(sema.db)?; + let (docs, range_map) = doc_owner.docs_with_rangemap(sema.db)?; let (markup, range_map) = - markup(Some(Either::Left(docs)), description, None, None, String::new()); + markup(Some(docs.into()), Some(range_map), description, None, None, String::new()); let markup = process_markup(sema.db, Definition::Module(doc_owner), &markup, range_map, config); Some(HoverResult { markup, actions }) } @@ -370,12 +370,12 @@ pub(super) fn process_markup( db: &RootDatabase, def: Definition, markup: &Markup, - markup_range_map: Option<hir::Docs>, + markup_range_map: Option<DocsRangeMap>, config: &HoverConfig<'_>, ) -> Markup { let markup = markup.as_str(); let markup = if config.links_in_hover { - rewrite_links(db, markup, def, markup_range_map.as_ref()) + rewrite_links(db, markup, def, markup_range_map) } else { remove_links(markup) }; @@ -484,7 +484,7 @@ pub(super) fn definition( config: &HoverConfig<'_>, edition: Edition, display_target: DisplayTarget, -) -> (Markup, Option<hir::Docs>) { +) -> (Markup, Option<DocsRangeMap>) { let mod_path = definition_path(db, &def, edition); let label = match def { Definition::Trait(trait_) => trait_ @@ -520,7 +520,12 @@ pub(super) fn definition( } _ => def.label(db, display_target), }; - let docs = def.docs_with_rangemap(db, famous_defs, display_target); + let (docs, range_map) = + if let Some((docs, doc_range)) = def.docs_with_rangemap(db, famous_defs, display_target) { + (Some(docs), doc_range) + } else { + (None, None) + }; let value = || match def { Definition::Variant(it) => { if !it.parent_enum(db).is_data_carrying(db) { @@ -837,7 +842,14 @@ pub(super) fn definition( } }; - markup(docs, desc, extra.is_empty().not().then_some(extra), mod_path, subst_types) + markup( + docs.map(Into::into), + range_map, + desc, + extra.is_empty().not().then_some(extra), + mod_path, + subst_types, + ) } #[derive(Debug)] @@ -1112,12 +1124,13 @@ fn definition_path(db: &RootDatabase, &def: &Definition, edition: Edition) -> Op } fn markup( - docs: Option<Either<Cow<'_, hir::Docs>, Documentation<'_>>>, + docs: Option<String>, + range_map: Option<DocsRangeMap>, rust: String, extra: Option<String>, mod_path: Option<String>, subst_types: String, -) -> (Markup, Option<hir::Docs>) { +) -> (Markup, Option<DocsRangeMap>) { let mut buf = String::new(); if let Some(mod_path) = mod_path @@ -1138,21 +1151,10 @@ fn markup( if let Some(doc) = docs { format_to!(buf, "\n___\n\n"); let offset = TextSize::new(buf.len() as u32); - let docs_str = match &doc { - Either::Left(docs) => docs.docs(), - Either::Right(docs) => docs.as_str(), - }; - format_to!(buf, "{}", docs_str); - let range_map = match doc { - Either::Left(range_map) => { - let mut range_map = range_map.into_owned(); - range_map.shift_by(offset); - Some(range_map) - } - Either::Right(_) => None, - }; + let buf_range_map = range_map.map(|range_map| range_map.shift_docstring_line_range(offset)); + format_to!(buf, "{}", doc); - (buf.into(), range_map) + (buf.into(), buf_range_map) } else { (buf.into(), None) } |