Skip to content

Commit

Permalink
Put back is_derive_trait_collision check
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeGomez committed Mar 24, 2023
1 parent 537fdbd commit 415a3ca
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 2 deletions.
31 changes: 29 additions & 2 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,20 @@ fn trait_impls_for<'a>(
iter.collect()
}

/// Check for resolve collisions between a trait and its derive.
///
/// These are common and we should just resolve to the trait in that case.
fn is_derive_trait_collision<T>(ns: &PerNS<Result<Vec<(Res, T)>, ResolutionFailure<'_>>>) -> bool {
if let (&Ok(ref type_ns), &Ok(ref macro_ns)) = (&ns.type_ns, &ns.macro_ns) {
type_ns.iter().any(|(res, _)| matches!(res, Res::Def(DefKind::Trait, _)))
&& macro_ns
.iter()
.any(|(res, _)| matches!(res, Res::Def(DefKind::Macro(MacroKind::Derive), _)))
} else {
false
}
}

impl<'a, 'tcx> DocVisitor for LinkCollector<'a, 'tcx> {
fn visit_item(&mut self, item: &Item) {
self.resolve_links(item);
Expand Down Expand Up @@ -1313,9 +1327,22 @@ impl LinkCollector<'_, '_> {
disambiguator,
candidates.into_iter().filter_map(|res| res.err()).collect(),
);
} else if len == 1 {
candidates.into_iter().filter_map(|res| res.ok()).flatten().collect::<Vec<_>>()
} else {
let has_derive_trait_collision = is_derive_trait_collision(&candidates);
if len == 2 && has_derive_trait_collision {
candidates.type_ns.unwrap()
} else {
// If we're reporting an ambiguity, don't mention the namespaces that failed
let mut candidates = candidates.map(|candidate| candidate.ok());
// If there a collision between a trait and a derive, we ignore the derive.
if has_derive_trait_collision {
candidates.macro_ns = None;
}
candidates.into_iter().filter_map(|res| res).flatten().collect::<Vec<_>>()
}
}

candidates.into_iter().filter_map(|res| res.ok()).flatten().collect::<Vec<_>>()
}
}
}
Expand Down
22 changes: 22 additions & 0 deletions tests/rustdoc-ui/intra-doc/issue-108653-associated-items-10.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// This test ensures that this warning doesn't show up:
// warning: `PartialEq` is both a trait and a derive macro
// --> tests/rustdoc-ui/intra-doc/issue-108653-associated-items-10.rs:1:7
// |
// 1 | //! [`PartialEq`]
// | ^^^^^^^^^ ambiguous link
// |
// = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default
// help: to link to the trait, prefix with `trait@`
// |
// 1 | //! [`trait@PartialEq`]
// | ++++++
// help: to link to the derive macro, prefix with `derive@`
// |
// 1 | //! [`derive@PartialEq`]
// | +++++++

// check-pass

#![deny(rustdoc::broken_intra_doc_links)]

//! [`PartialEq`]

0 comments on commit 415a3ca

Please sign in to comment.