@@ -606,7 +606,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
606606 ty:: AssocKind :: Const => "associatedconstant" ,
607607 ty:: AssocKind :: Type => "associatedtype" ,
608608 } ;
609- Some ( if extra_fragment. is_some ( ) {
609+ return Some ( if extra_fragment. is_some ( ) {
610610 Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: RustdocAnchorConflict (
611611 root_res,
612612 ) ) )
@@ -616,51 +616,41 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
616616 // Store the kind in a side channel so that only the disambiguator logic looks at it.
617617 self . kind_side_channel . set ( Some ( ( kind. as_def_kind ( ) , id) ) ) ;
618618 Ok ( ( root_res, Some ( format ! ( "{}.{}" , out, item_name) ) ) )
619- } )
620- } else if ns == Namespace :: ValueNS {
621- debug ! ( "looking for variants or fields named {} for {:?}" , item_name, did) ;
622- // FIXME(jynelson): why is this different from
623- // `variant_field`?
624- match tcx. type_of ( did) . kind ( ) {
625- ty:: Adt ( def, _) => {
626- let field = if def. is_enum ( ) {
627- def. all_fields ( ) . find ( |item| item. ident . name == item_name)
628- } else {
629- def. non_enum_variant ( )
630- . fields
631- . iter ( )
632- . find ( |item| item. ident . name == item_name)
633- } ;
634- field. map ( |item| {
635- if extra_fragment. is_some ( ) {
636- let res = Res :: Def (
637- if def. is_enum ( ) {
638- DefKind :: Variant
639- } else {
640- DefKind :: Field
641- } ,
642- item. did ,
643- ) ;
644- Err ( ErrorKind :: AnchorFailure (
645- AnchorFailure :: RustdocAnchorConflict ( res) ,
646- ) )
647- } else {
648- Ok ( (
649- root_res,
650- Some ( format ! (
651- "{}.{}" ,
652- if def. is_enum( ) { "variant" } else { "structfield" } ,
653- item. ident
654- ) ) ,
655- ) )
656- }
657- } )
658- }
659- _ => None ,
660- }
661- } else {
662- None
619+ } ) ;
620+ }
621+
622+ if ns != Namespace :: ValueNS {
623+ return None ;
663624 }
625+ debug ! ( "looking for variants or fields named {} for {:?}" , item_name, did) ;
626+ // FIXME: this doesn't really belong in `associated_item` (maybe `variant_field` is better?)
627+ // NOTE: it's different from variant_field because it resolves fields and variants,
628+ // not variant fields (2 path segments, not 3).
629+ let def = match tcx. type_of ( did) . kind ( ) {
630+ ty:: Adt ( def, _) => def,
631+ _ => return None ,
632+ } ;
633+ let field = if def. is_enum ( ) {
634+ def. all_fields ( ) . find ( |item| item. ident . name == item_name)
635+ } else {
636+ def. non_enum_variant ( ) . fields . iter ( ) . find ( |item| item. ident . name == item_name)
637+ } ?;
638+ Some ( if extra_fragment. is_some ( ) {
639+ let res = Res :: Def (
640+ if def. is_enum ( ) { DefKind :: Variant } else { DefKind :: Field } ,
641+ field. did ,
642+ ) ;
643+ Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: RustdocAnchorConflict ( res) ) )
644+ } else {
645+ Ok ( (
646+ root_res,
647+ Some ( format ! (
648+ "{}.{}" ,
649+ if def. is_enum( ) { "variant" } else { "structfield" } ,
650+ field. ident
651+ ) ) ,
652+ ) )
653+ } )
664654 }
665655 Res :: Def ( DefKind :: Trait , did) => tcx
666656 . associated_items ( did)
0 commit comments