Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/doc_links.rs')
-rw-r--r--crates/ide/src/doc_links.rs38
1 files changed, 18 insertions, 20 deletions
diff --git a/crates/ide/src/doc_links.rs b/crates/ide/src/doc_links.rs
index c197d559aa..0ed91cf7f5 100644
--- a/crates/ide/src/doc_links.rs
+++ b/crates/ide/src/doc_links.rs
@@ -13,13 +13,13 @@ use stdx::format_to;
use url::Url;
use hir::{
- Adt, AsAssocItem, AssocItem, AssocItemContainer, AttrsWithOwner, HasAttrs, db::HirDatabase, sym,
+ Adt, AsAssocItem, AssocItem, AssocItemContainer, AttrsWithOwner, HasAttrs, db::HirDatabase,
};
use ide_db::{
RootDatabase,
base_db::{CrateOrigin, LangCrateOrigin, ReleaseChannel, RootQueryDb},
defs::{Definition, NameClass, NameRefClass},
- documentation::{DocsRangeMap, Documentation, HasDocs, docs_with_rangemap},
+ documentation::{Documentation, HasDocs},
helpers::pick_best_token,
};
use syntax::{
@@ -54,7 +54,7 @@ pub(crate) fn rewrite_links(
db: &RootDatabase,
markdown: &str,
definition: Definition,
- range_map: Option<DocsRangeMap>,
+ range_map: Option<&hir::Docs>,
) -> String {
let mut cb = broken_link_clone_cb;
let doc = Parser::new_with_broken_link_callback(markdown, MARKDOWN_OPTIONS, Some(&mut cb))
@@ -74,9 +74,9 @@ pub(crate) fn rewrite_links(
TextRange::new(range.start.try_into().unwrap(), range.end.try_into().unwrap());
let is_inner_doc = range_map
.as_ref()
- .and_then(|range_map| range_map.map(text_range))
- .map(|(_, attr_id)| attr_id.is_inner_attr())
- .unwrap_or(false);
+ .and_then(|range_map| range_map.find_ast_range(text_range))
+ .map(|(_, is_inner)| is_inner)
+ .unwrap_or(hir::IsInnerDoc::No);
if let Some((target, title)) =
rewrite_intra_doc_link(db, definition, target, title, is_inner_doc, link_type)
{
@@ -187,7 +187,7 @@ pub(crate) fn external_docs(
/// Extracts all links from a given markdown text returning the definition text range, link-text
/// and the namespace if known.
pub(crate) fn extract_definitions_from_docs(
- docs: &Documentation,
+ docs: &Documentation<'_>,
) -> Vec<(TextRange, String, Option<hir::Namespace>)> {
Parser::new_with_broken_link_callback(
docs.as_str(),
@@ -214,7 +214,7 @@ pub(crate) fn resolve_doc_path_for_def(
def: Definition,
link: &str,
ns: Option<hir::Namespace>,
- is_inner_doc: bool,
+ is_inner_doc: hir::IsInnerDoc,
) -> Option<Definition> {
match def {
Definition::Module(it) => it.resolve_doc_path(db, link, ns, is_inner_doc),
@@ -324,11 +324,11 @@ impl DocCommentToken {
let token_start = t.text_range().start();
let abs_in_expansion_offset = token_start + relative_comment_offset + descended_prefix_len;
let (attributes, def) = Self::doc_attributes(sema, &node, is_inner)?;
- let (docs, doc_mapping) = docs_with_rangemap(sema.db, &attributes)?;
+ let doc_mapping = attributes.hir_docs(sema.db)?;
let (in_expansion_range, link, ns, is_inner) =
- extract_definitions_from_docs(&docs).into_iter().find_map(|(range, link, ns)| {
- let (mapped, idx) = doc_mapping.map(range)?;
- (mapped.value.contains(abs_in_expansion_offset)).then_some((mapped.value, link, ns, idx.is_inner_attr()))
+ extract_definitions_from_docs(&Documentation::new_borrowed(doc_mapping.docs())).into_iter().find_map(|(range, link, ns)| {
+ let (mapped, is_inner) = doc_mapping.find_ast_range(range)?;
+ (mapped.value.contains(abs_in_expansion_offset)).then_some((mapped.value, link, ns, is_inner))
})?;
// get the relative range to the doc/attribute in the expansion
let in_expansion_relative_range = in_expansion_range - descended_prefix_len - token_start;
@@ -416,7 +416,7 @@ fn rewrite_intra_doc_link(
def: Definition,
target: &str,
title: &str,
- is_inner_doc: bool,
+ is_inner_doc: hir::IsInnerDoc,
link_type: LinkType,
) -> Option<(String, String)> {
let (link, ns) = parse_intra_doc_link(target);
@@ -659,14 +659,12 @@ fn filename_and_frag_for_def(
Definition::Crate(_) => String::from("index.html"),
Definition::Module(m) => match m.name(db) {
// `#[doc(keyword = "...")]` is internal used only by rust compiler
- Some(name) => {
- match m.attrs(db).by_key(sym::doc).find_string_value_in_tt(sym::keyword) {
- Some(kw) => {
- format!("keyword.{kw}.html")
- }
- None => format!("{}/index.html", name.as_str()),
+ Some(name) => match m.doc_keyword(db) {
+ Some(kw) => {
+ format!("keyword.{kw}.html")
}
- }
+ None => format!("{}/index.html", name.as_str()),
+ },
None => String::from("index.html"),
},
Definition::Trait(t) => {