@@ -251,6 +251,7 @@ struct ResolutionInfo {
251
251
extra_fragment : Option < String > ,
252
252
}
253
253
254
+ #[ derive( Clone ) ]
254
255
struct DiagnosticInfo < ' a > {
255
256
item : & ' a Item ,
256
257
dox : & ' a str ,
@@ -949,19 +950,19 @@ impl LinkCollector<'_, '_> {
949
950
return None ;
950
951
}
951
952
953
+ let diag_info = DiagnosticInfo {
954
+ item,
955
+ dox,
956
+ ori_link : & ori_link. link ,
957
+ link_range : ori_link. range . clone ( ) ,
958
+ } ;
959
+
952
960
let link = ori_link. link . replace ( "`" , "" ) ;
953
961
let no_backticks_range = range_between_backticks ( & ori_link) ;
954
962
let parts = link. split ( '#' ) . collect :: < Vec < _ > > ( ) ;
955
963
let ( link, extra_fragment) = if parts. len ( ) > 2 {
956
964
// A valid link can't have multiple #'s
957
- anchor_failure (
958
- self . cx ,
959
- & item,
960
- & link,
961
- dox,
962
- ori_link. range ,
963
- AnchorFailure :: MultipleAnchors ,
964
- ) ;
965
+ anchor_failure ( self . cx , diag_info, AnchorFailure :: MultipleAnchors ) ;
965
966
return None ;
966
967
} else if parts. len ( ) == 2 {
967
968
if parts[ 0 ] . trim ( ) . is_empty ( ) {
@@ -1092,20 +1093,14 @@ impl LinkCollector<'_, '_> {
1092
1093
return None ;
1093
1094
}
1094
1095
1095
- let diag_info = DiagnosticInfo {
1096
- item,
1097
- dox,
1098
- ori_link : & ori_link. link ,
1099
- link_range : ori_link. range . clone ( ) ,
1100
- } ;
1101
1096
let ( mut res, mut fragment) = self . resolve_with_disambiguator_cached (
1102
1097
ResolutionInfo {
1103
1098
module_id,
1104
1099
dis : disambiguator,
1105
1100
path_str : path_str. to_owned ( ) ,
1106
1101
extra_fragment,
1107
1102
} ,
1108
- diag_info,
1103
+ diag_info. clone ( ) , // this struct should really be Copy, but Range is not :(
1109
1104
matches ! ( ori_link. kind, LinkType :: Reference | LinkType :: Shortcut ) ,
1110
1105
) ?;
1111
1106
@@ -1123,10 +1118,7 @@ impl LinkCollector<'_, '_> {
1123
1118
if fragment. is_some ( ) {
1124
1119
anchor_failure (
1125
1120
self . cx ,
1126
- & item,
1127
- path_str,
1128
- dox,
1129
- ori_link. range ,
1121
+ diag_info,
1130
1122
AnchorFailure :: RustdocAnchorConflict ( prim) ,
1131
1123
) ;
1132
1124
return None ;
@@ -1360,14 +1352,7 @@ impl LinkCollector<'_, '_> {
1360
1352
None
1361
1353
}
1362
1354
Err ( ErrorKind :: AnchorFailure ( msg) ) => {
1363
- anchor_failure (
1364
- self . cx ,
1365
- diag. item ,
1366
- diag. ori_link ,
1367
- diag. dox ,
1368
- diag. link_range ,
1369
- msg,
1370
- ) ;
1355
+ anchor_failure ( self . cx , diag, msg) ;
1371
1356
None
1372
1357
}
1373
1358
}
@@ -1384,29 +1369,15 @@ impl LinkCollector<'_, '_> {
1384
1369
Ok ( res)
1385
1370
}
1386
1371
Err ( ErrorKind :: AnchorFailure ( msg) ) => {
1387
- anchor_failure (
1388
- self . cx ,
1389
- diag. item ,
1390
- diag. ori_link ,
1391
- diag. dox ,
1392
- diag. link_range ,
1393
- msg,
1394
- ) ;
1372
+ anchor_failure ( self . cx , diag, msg) ;
1395
1373
return None ;
1396
1374
}
1397
1375
Err ( ErrorKind :: Resolve ( box kind) ) => Err ( kind) ,
1398
1376
} ,
1399
1377
value_ns : match self . resolve ( path_str, ValueNS , base_node, extra_fragment) {
1400
1378
Ok ( res) => Ok ( res) ,
1401
1379
Err ( ErrorKind :: AnchorFailure ( msg) ) => {
1402
- anchor_failure (
1403
- self . cx ,
1404
- diag. item ,
1405
- diag. ori_link ,
1406
- diag. dox ,
1407
- diag. link_range ,
1408
- msg,
1409
- ) ;
1380
+ anchor_failure ( self . cx , diag, msg) ;
1410
1381
return None ;
1411
1382
}
1412
1383
Err ( ErrorKind :: Resolve ( box kind) ) => Err ( kind) ,
@@ -2004,10 +1975,7 @@ fn resolution_failure(
2004
1975
/// Report an anchor failure.
2005
1976
fn anchor_failure (
2006
1977
cx : & DocContext < ' _ > ,
2007
- item : & Item ,
2008
- ori_link : & str ,
2009
- dox : & str ,
2010
- link_range : Range < usize > ,
1978
+ DiagnosticInfo { item, ori_link, dox, link_range } : DiagnosticInfo < ' _ > ,
2011
1979
failure : AnchorFailure ,
2012
1980
) {
2013
1981
let msg = match failure {
0 commit comments