@@ -12,6 +12,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
1212use rustc_middle:: ty;
1313use rustc_resolve:: ParentScope ;
1414use rustc_session:: lint;
15+ use rustc_span:: hygiene:: MacroKind ;
1516use rustc_span:: symbol:: Ident ;
1617use rustc_span:: symbol:: Symbol ;
1718use rustc_span:: DUMMY_SP ;
@@ -407,6 +408,22 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
407408 }
408409}
409410
411+ /// Check for resolve collisions between a trait and its derive
412+ ///
413+ /// These are common and we should just resolve to the trait in that case
414+ fn is_derive_trait_collision < T > ( ns : & PerNS < Option < ( Res , T ) > > ) -> bool {
415+ if let PerNS {
416+ type_ns : Some ( ( Res :: Def ( DefKind :: Trait , _) , _) ) ,
417+ macro_ns : Some ( ( Res :: Def ( DefKind :: Macro ( MacroKind :: Derive ) , _) , _) ) ,
418+ ..
419+ } = * ns
420+ {
421+ true
422+ } else {
423+ false
424+ }
425+ }
426+
410427impl < ' a , ' tcx > DocFolder for LinkCollector < ' a , ' tcx > {
411428 fn fold_item ( & mut self , mut item : Item ) -> Option < Item > {
412429 let item_hir_id = if item. is_mod ( ) {
@@ -650,7 +667,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
650667 }
651668 None => {
652669 // Try everything!
653- let candidates = PerNS {
670+ let mut candidates = PerNS {
654671 macro_ns : self
655672 . macro_resolve ( path_str, base_node)
656673 . map ( |res| ( res, extra_fragment. clone ( ) ) ) ,
@@ -705,10 +722,16 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
705722 continue ;
706723 }
707724
708- let is_unambiguous = candidates. clone ( ) . present_items ( ) . count ( ) == 1 ;
709- if is_unambiguous {
725+ let len = candidates. clone ( ) . present_items ( ) . count ( ) ;
726+
727+ if len == 1 {
710728 candidates. present_items ( ) . next ( ) . unwrap ( )
729+ } else if len == 2 && is_derive_trait_collision ( & candidates) {
730+ candidates. type_ns . unwrap ( )
711731 } else {
732+ if is_derive_trait_collision ( & candidates) {
733+ candidates. macro_ns = None ;
734+ }
712735 ambiguity_error (
713736 cx,
714737 & item,
0 commit comments