Put back is_derive_trait_collision
check
This commit is contained in:
parent
537fdbd75b
commit
415a3ca909
@ -806,6 +806,20 @@ fn trait_impls_for<'a>(
|
|||||||
iter.collect()
|
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> {
|
impl<'a, 'tcx> DocVisitor for LinkCollector<'a, 'tcx> {
|
||||||
fn visit_item(&mut self, item: &Item) {
|
fn visit_item(&mut self, item: &Item) {
|
||||||
self.resolve_links(item);
|
self.resolve_links(item);
|
||||||
@ -1313,9 +1327,22 @@ impl LinkCollector<'_, '_> {
|
|||||||
disambiguator,
|
disambiguator,
|
||||||
candidates.into_iter().filter_map(|res| res.err()).collect(),
|
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<_>>()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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`]
|
Loading…
x
Reference in New Issue
Block a user