@@ -110,12 +110,7 @@ impl ResolutionFailure<'a> {
110
110
111
111
enum AnchorFailure {
112
112
MultipleAnchors ,
113
- Primitive ,
114
- Variant ,
115
- AssocConstant ,
116
- AssocType ,
117
- Field ,
118
- Method ,
113
+ RustdocAnchorConflict ( Res ) ,
119
114
}
120
115
121
116
struct LinkCollector < ' a , ' tcx > {
@@ -288,7 +283,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
288
283
// Not a trait item; just return what we found.
289
284
Res :: PrimTy ( ..) => {
290
285
if extra_fragment. is_some ( ) {
291
- return Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: Primitive ) ) ;
286
+ return Err ( ErrorKind :: AnchorFailure (
287
+ AnchorFailure :: RustdocAnchorConflict ( res) ,
288
+ ) ) ;
292
289
}
293
290
return Ok ( ( res, Some ( path_str. to_owned ( ) ) ) ) ;
294
291
}
@@ -305,7 +302,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
305
302
}
306
303
} else if let Some ( ( path, prim) ) = is_primitive ( path_str, ns) {
307
304
if extra_fragment. is_some ( ) {
308
- return Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: Primitive ) ) ;
305
+ return Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: RustdocAnchorConflict (
306
+ prim,
307
+ ) ) ) ;
309
308
}
310
309
return Ok ( ( prim, Some ( path. to_owned ( ) ) ) ) ;
311
310
}
@@ -444,11 +443,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
444
443
ty:: AssocKind :: Type => "associatedtype" ,
445
444
} ;
446
445
Some ( if extra_fragment. is_some ( ) {
447
- Err ( ErrorKind :: AnchorFailure ( if kind == ty:: AssocKind :: Fn {
448
- AnchorFailure :: Method
449
- } else {
450
- AnchorFailure :: AssocConstant
451
- } ) )
446
+ Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: RustdocAnchorConflict (
447
+ ty_res,
448
+ ) ) )
452
449
} else {
453
450
// HACK(jynelson): `clean` expects the type, not the associated item.
454
451
// but the disambiguator logic expects the associated item.
@@ -470,11 +467,17 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
470
467
} ;
471
468
field. map ( |item| {
472
469
if extra_fragment. is_some ( ) {
473
- Err ( ErrorKind :: AnchorFailure ( if def. is_enum ( ) {
474
- AnchorFailure :: Variant
475
- } else {
476
- AnchorFailure :: Field
477
- } ) )
470
+ let res = Res :: Def (
471
+ if def. is_enum ( ) {
472
+ DefKind :: Variant
473
+ } else {
474
+ DefKind :: Field
475
+ } ,
476
+ item. did ,
477
+ ) ;
478
+ Err ( ErrorKind :: AnchorFailure (
479
+ AnchorFailure :: RustdocAnchorConflict ( res) ,
480
+ ) )
478
481
} else {
479
482
Ok ( (
480
483
ty_res,
@@ -518,13 +521,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
518
521
} ;
519
522
520
523
if extra_fragment. is_some ( ) {
521
- Err ( ErrorKind :: AnchorFailure ( if item. kind == ty:: AssocKind :: Const {
522
- AnchorFailure :: AssocConstant
523
- } else if item. kind == ty:: AssocKind :: Type {
524
- AnchorFailure :: AssocType
525
- } else {
526
- AnchorFailure :: Method
527
- } ) )
524
+ Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: RustdocAnchorConflict (
525
+ ty_res,
526
+ ) ) )
528
527
} else {
529
528
let res = Res :: Def ( item. kind . as_def_kind ( ) , item. def_id ) ;
530
529
Ok ( ( res, Some ( format ! ( "{}.{}" , kind, item_name) ) ) )
@@ -889,8 +888,10 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
889
888
Some ( res. 0 )
890
889
}
891
890
Err ( ErrorKind :: Resolve ( kind) ) => kind. full_res ( ) ,
892
- // TODO: add `Res` to AnchorFailure
893
- Err ( ErrorKind :: AnchorFailure ( _) ) => None ,
891
+ Err ( ErrorKind :: AnchorFailure (
892
+ AnchorFailure :: RustdocAnchorConflict ( res) ,
893
+ ) ) => Some ( res) ,
894
+ Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: MultipleAnchors ) ) => None ,
894
895
} ;
895
896
this. kind_side_channel . take ( ) . map ( |( kind, id) | Res :: Def ( kind, id) ) . or ( res)
896
897
} ;
@@ -1070,7 +1071,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
1070
1071
path_str,
1071
1072
& dox,
1072
1073
link_range,
1073
- AnchorFailure :: Primitive ,
1074
+ AnchorFailure :: RustdocAnchorConflict ( prim ) ,
1074
1075
) ;
1075
1076
continue ;
1076
1077
}
@@ -1555,28 +1556,11 @@ fn anchor_failure(
1555
1556
) {
1556
1557
let msg = match failure {
1557
1558
AnchorFailure :: MultipleAnchors => format ! ( "`{}` contains multiple anchors" , path_str) ,
1558
- AnchorFailure :: Primitive
1559
- | AnchorFailure :: Variant
1560
- | AnchorFailure :: AssocConstant
1561
- | AnchorFailure :: AssocType
1562
- | AnchorFailure :: Field
1563
- | AnchorFailure :: Method => {
1564
- let kind = match failure {
1565
- AnchorFailure :: Primitive => "primitive type" ,
1566
- AnchorFailure :: Variant => "enum variant" ,
1567
- AnchorFailure :: AssocConstant => "associated constant" ,
1568
- AnchorFailure :: AssocType => "associated type" ,
1569
- AnchorFailure :: Field => "struct field" ,
1570
- AnchorFailure :: Method => "method" ,
1571
- AnchorFailure :: MultipleAnchors => unreachable ! ( "should be handled already" ) ,
1572
- } ;
1573
-
1574
- format ! (
1575
- "`{}` contains an anchor, but links to {kind}s are already anchored" ,
1576
- path_str,
1577
- kind = kind
1578
- )
1579
- }
1559
+ AnchorFailure :: RustdocAnchorConflict ( res) => format ! (
1560
+ "`{}` contains an anchor, but links to {kind}s are already anchored" ,
1561
+ path_str,
1562
+ kind = res. descr( ) ,
1563
+ ) ,
1580
1564
} ;
1581
1565
1582
1566
report_diagnostic ( cx, & msg, item, dox, & link_range, |diag, sp| {
@@ -1689,7 +1673,7 @@ fn handle_variant(
1689
1673
use rustc_middle:: ty:: DefIdTree ;
1690
1674
1691
1675
if extra_fragment. is_some ( ) {
1692
- return Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: Variant ) ) ;
1676
+ return Err ( ErrorKind :: AnchorFailure ( AnchorFailure :: RustdocAnchorConflict ( res ) ) ) ;
1693
1677
}
1694
1678
let parent = if let Some ( parent) = cx. tcx . parent ( res. def_id ( ) ) {
1695
1679
parent
0 commit comments