mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-17 18:57:04 +00:00
check module path inner or outer
Signed-off-by: Hayashi Mikihiro <34ttrweoewiwe28@gmail.com>
This commit is contained in:
parent
ab4ba5cd29
commit
778322eb31
10 changed files with 256 additions and 130 deletions
|
|
@ -11,7 +11,7 @@ use hir::{
|
|||
use ide_db::{
|
||||
RootDatabase,
|
||||
defs::Definition,
|
||||
documentation::HasDocs,
|
||||
documentation::{DocsRangeMap, HasDocs},
|
||||
famous_defs::FamousDefs,
|
||||
generated::lints::{CLIPPY_LINTS, DEFAULT_LINTS, FEATURES},
|
||||
syntax_helpers::prettify_macro_expansion,
|
||||
|
|
@ -21,7 +21,7 @@ use rustc_apfloat::{
|
|||
Float,
|
||||
ieee::{Half as f16, Quad as f128},
|
||||
};
|
||||
use span::Edition;
|
||||
use span::{Edition, TextSize};
|
||||
use stdx::format_to;
|
||||
use syntax::{AstNode, AstToken, Direction, SyntaxToken, T, algo, ast, match_ast};
|
||||
|
||||
|
|
@ -276,13 +276,10 @@ 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(sema.db)?;
|
||||
let markup = process_markup(
|
||||
sema.db,
|
||||
Definition::Module(doc_owner),
|
||||
&markup(Some(docs.into()), description, None, None, String::new()),
|
||||
config,
|
||||
);
|
||||
let (docs, range_map) = doc_owner.docs_with_rangemap(sema.db)?;
|
||||
let (markup, range_map) =
|
||||
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 })
|
||||
}
|
||||
|
||||
|
|
@ -371,11 +368,15 @@ pub(super) fn process_markup(
|
|||
db: &RootDatabase,
|
||||
def: Definition,
|
||||
markup: &Markup,
|
||||
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) } else { remove_links(markup) };
|
||||
let markup = if config.links_in_hover {
|
||||
rewrite_links(db, markup, def, markup_range_map)
|
||||
} else {
|
||||
remove_links(markup)
|
||||
};
|
||||
Markup::from(markup)
|
||||
}
|
||||
|
||||
|
|
@ -482,7 +483,7 @@ pub(super) fn definition(
|
|||
config: &HoverConfig,
|
||||
edition: Edition,
|
||||
display_target: DisplayTarget,
|
||||
) -> Markup {
|
||||
) -> (Markup, Option<DocsRangeMap>) {
|
||||
let mod_path = definition_path(db, &def, edition);
|
||||
let label = match def {
|
||||
Definition::Trait(trait_) => trait_
|
||||
|
|
@ -518,7 +519,12 @@ pub(super) fn definition(
|
|||
}
|
||||
_ => def.label(db, display_target),
|
||||
};
|
||||
let docs = def.docs(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) {
|
||||
|
|
@ -807,6 +813,7 @@ pub(super) fn definition(
|
|||
|
||||
markup(
|
||||
docs.map(Into::into),
|
||||
range_map,
|
||||
desc,
|
||||
extra.is_empty().not().then_some(extra),
|
||||
mod_path,
|
||||
|
|
@ -1083,11 +1090,12 @@ fn definition_path(db: &RootDatabase, &def: &Definition, edition: Edition) -> Op
|
|||
|
||||
fn markup(
|
||||
docs: Option<String>,
|
||||
range_map: Option<DocsRangeMap>,
|
||||
rust: String,
|
||||
extra: Option<String>,
|
||||
mod_path: Option<String>,
|
||||
subst_types: String,
|
||||
) -> Markup {
|
||||
) -> (Markup, Option<DocsRangeMap>) {
|
||||
let mut buf = String::new();
|
||||
|
||||
if let Some(mod_path) = mod_path {
|
||||
|
|
@ -1106,9 +1114,15 @@ fn markup(
|
|||
}
|
||||
|
||||
if let Some(doc) = docs {
|
||||
format_to!(buf, "\n___\n\n{}", doc);
|
||||
format_to!(buf, "\n___\n\n");
|
||||
let offset = TextSize::new(buf.len() as u32);
|
||||
let buf_range_map = range_map.map(|range_map| range_map.shift_docstring_line_range(offset));
|
||||
format_to!(buf, "{}", doc);
|
||||
|
||||
(buf.into(), buf_range_map)
|
||||
} else {
|
||||
(buf.into(), None)
|
||||
}
|
||||
buf.into()
|
||||
}
|
||||
|
||||
fn find_std_module(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue