rustdoc: Resolve doc links in external traits having local impls

This commit is contained in:
Vadim Petrochenkov 2022-11-13 16:31:00 +03:00
parent 928d14bcd1
commit 8e81cc262e
3 changed files with 27 additions and 1 deletions

View File

@ -1932,6 +1932,11 @@ pub fn macro_rules_scope(&self, def_id: LocalDefId) -> (MacroRulesScopeRef<'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> {

View File

@ -354,7 +354,14 @@ fn visit_item(&mut self, item: &ast::Item) {
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 => {

View File

@ -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() {}