Skip to content

Commit

Permalink
Rollup merge of rust-lang#104364 - petrochenkov:docice2, r=GuillaumeG…
Browse files Browse the repository at this point in the history
…omez

rustdoc: Resolve doc links in external traits having local impls

For external impls it was done in rust-lang#103192 right away, but the local impl case was forgotten.

Fixes rust-lang#104145.
  • Loading branch information
matthiaskrgr authored Nov 14, 2022
2 parents 32eef50 + 8e81cc2 commit 0a48a45
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
5 changes: 5 additions & 0 deletions compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1932,6 +1932,11 @@ impl<'a> Resolver<'a> {
}
}

/// For rustdoc.
pub fn get_partial_res(&self, node_id: NodeId) -> Option<PartialRes> {
self.partial_res_map.get(&node_id).copied()
}

/// Retrieves the span of the given `DefId` if `DefId` is in the local crate.
#[inline]
pub fn opt_span(&self, def_id: DefId) -> Option<Span> {
Expand Down
9 changes: 8 additions & 1 deletion src/librustdoc/passes/collect_intra_doc_links/early.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,14 @@ impl Visitor<'_> for EarlyDocLinkResolver<'_, '_> {
self.parent_scope.module = old_module;
} else {
match &item.kind {
ItemKind::Impl(box ast::Impl { of_trait: Some(..), .. }) => {
ItemKind::Impl(box ast::Impl { of_trait: Some(trait_ref), .. }) => {
if let Some(partial_res) = self.resolver.get_partial_res(trait_ref.ref_id)
&& let Some(res) = partial_res.full_res()
&& let Some(trait_def_id) = res.opt_def_id()
&& !trait_def_id.is_local()
&& self.visited_mods.insert(trait_def_id) {
self.resolve_doc_links_extern_impl(trait_def_id, false);
}
self.all_trait_impls.push(self.resolver.local_def_id(item.id).to_def_id());
}
ItemKind::MacroDef(macro_def) if macro_def.macro_rules => {
Expand Down
14 changes: 14 additions & 0 deletions src/test/rustdoc/intra-doc/issue-104145.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Doc links in `Trait`'s methods are resolved because it has a local impl.

// aux-build:issue-103463-aux.rs

extern crate issue_103463_aux;
use issue_103463_aux::Trait;

pub struct LocalType;

impl Trait for LocalType {
fn method() {}
}

fn main() {}

0 comments on commit 0a48a45

Please sign in to comment.