Skip to content

Commit 0b3404b

Browse files
committed
Auto merge of #96261 - petrochenkov:doclink7, r=GuillaumeGomez
rustdoc: Resolve some more doc links early Trying another subset of #94857 that is not too expensive.
2 parents 10baaa6 + e0b71ff commit 0b3404b

File tree

3 files changed

+28
-7
lines changed

3 files changed

+28
-7
lines changed

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

+8
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,14 @@ impl CStore {
532532
self.get_crate_data(cnum).get_all_incoherent_impls()
533533
}
534534

535+
pub fn associated_item_def_ids_untracked<'a>(
536+
&'a self,
537+
def_id: DefId,
538+
sess: &'a Session,
539+
) -> impl Iterator<Item = DefId> + 'a {
540+
self.get_crate_data(def_id.krate).get_associated_item_def_ids(def_id.index, sess)
541+
}
542+
535543
pub fn may_have_doc_links_untracked(&self, def_id: DefId) -> bool {
536544
self.get_crate_data(def_id.krate).get_may_have_doc_links(def_id.index)
537545
}

src/librustdoc/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,7 @@ fn main_options(options: config::Options) -> MainResult {
795795
let resolver_caches = resolver.borrow_mut().access(|resolver| {
796796
collect_intra_doc_links::early_resolve_intra_doc_links(
797797
resolver,
798+
sess,
798799
krate,
799800
externs,
800801
document_private,

src/librustdoc/passes/collect_intra_doc_links/early.rs

+19-7
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,22 @@ use rustc_hir::TraitCandidate;
1414
use rustc_middle::ty::{DefIdTree, Visibility};
1515
use rustc_resolve::{ParentScope, Resolver};
1616
use rustc_session::config::Externs;
17+
use rustc_session::Session;
1718
use rustc_span::{Symbol, SyntaxContext};
1819

1920
use std::collections::hash_map::Entry;
2021
use std::mem;
2122

2223
crate fn early_resolve_intra_doc_links(
2324
resolver: &mut Resolver<'_>,
25+
sess: &Session,
2426
krate: &ast::Crate,
2527
externs: Externs,
2628
document_private_items: bool,
2729
) -> ResolverCaches {
2830
let mut link_resolver = EarlyDocLinkResolver {
2931
resolver,
32+
sess,
3033
current_mod: CRATE_DEF_ID,
3134
visited_mods: Default::default(),
3235
markdown_links: Default::default(),
@@ -70,6 +73,7 @@ fn doc_attrs<'a>(attrs: impl Iterator<Item = &'a ast::Attribute>) -> Attributes
7073

7174
struct EarlyDocLinkResolver<'r, 'ra> {
7275
resolver: &'r mut Resolver<'ra>,
76+
sess: &'r Session,
7377
current_mod: LocalDefId,
7478
visited_mods: DefIdSet,
7579
markdown_links: FxHashMap<String, Vec<PreprocessedMarkdownLink>>,
@@ -167,14 +171,22 @@ impl EarlyDocLinkResolver<'_, '_> {
167171
}
168172
}
169173

170-
fn resolve_doc_links_extern_impl(&mut self, def_id: DefId, _is_inherent: bool) {
171-
// FIXME: Resolve links in associated items in addition to traits themselves,
172-
// `force` is used to provide traits in scope for the associated items.
173-
self.resolve_doc_links_extern_outer(def_id, def_id, true);
174+
fn resolve_doc_links_extern_impl(&mut self, def_id: DefId, is_inherent: bool) {
175+
self.resolve_doc_links_extern_outer(def_id, def_id);
176+
let assoc_item_def_ids = Vec::from_iter(
177+
self.resolver.cstore().associated_item_def_ids_untracked(def_id, self.sess),
178+
);
179+
for assoc_def_id in assoc_item_def_ids {
180+
if !is_inherent
181+
|| self.resolver.cstore().visibility_untracked(assoc_def_id) == Visibility::Public
182+
{
183+
self.resolve_doc_links_extern_outer(assoc_def_id, def_id);
184+
}
185+
}
174186
}
175187

176-
fn resolve_doc_links_extern_outer(&mut self, def_id: DefId, scope_id: DefId, force: bool) {
177-
if !force && !self.resolver.cstore().may_have_doc_links_untracked(def_id) {
188+
fn resolve_doc_links_extern_outer(&mut self, def_id: DefId, scope_id: DefId) {
189+
if !self.resolver.cstore().may_have_doc_links_untracked(def_id) {
178190
return;
179191
}
180192
// FIXME: actually resolve links, not just add traits in scope.
@@ -246,7 +258,7 @@ impl EarlyDocLinkResolver<'_, '_> {
246258
Res::Def(DefKind::Variant, ..) => self.resolver.parent(def_id).unwrap(),
247259
_ => def_id,
248260
};
249-
self.resolve_doc_links_extern_outer(def_id, scope_id, false); // Outer attribute scope
261+
self.resolve_doc_links_extern_outer(def_id, scope_id); // Outer attribute scope
250262
if let Res::Def(DefKind::Mod, ..) = child.res {
251263
self.resolve_doc_links_extern_inner(def_id); // Inner attribute scope
252264
}

0 commit comments

Comments
 (0)