@@ -251,6 +251,7 @@ struct ResolutionInfo {
251251 extra_fragment : Option < String > ,
252252}
253253
254+ #[ derive( Clone ) ]
254255struct DiagnosticInfo < ' a > {
255256 item : & ' a Item ,
256257 dox : & ' a str ,
@@ -949,19 +950,19 @@ impl LinkCollector<'_, '_> {
949950 return None ;
950951 }
951952
953+ let diag_info = DiagnosticInfo {
954+ item,
955+ dox,
956+ ori_link : & ori_link. link ,
957+ link_range : ori_link. range . clone ( ) ,
958+ } ;
959+
952960 let link = ori_link. link . replace ( "`" , "" ) ;
953961 let no_backticks_range = range_between_backticks ( & ori_link) ;
954962 let parts = link. split ( '#' ) . collect :: < Vec < _ > > ( ) ;
955963 let ( link, extra_fragment) = if parts. len ( ) > 2 {
956964 // 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 ) ;
965966 return None ;
966967 } else if parts. len ( ) == 2 {
967968 if parts[ 0 ] . trim ( ) . is_empty ( ) {
@@ -1092,20 +1093,14 @@ impl LinkCollector<'_, '_> {
10921093 return None ;
10931094 }
10941095
1095- let diag_info = DiagnosticInfo {
1096- item,
1097- dox,
1098- ori_link : & ori_link. link ,
1099- link_range : ori_link. range . clone ( ) ,
1100- } ;
11011096 let ( mut res, mut fragment) = self . resolve_with_disambiguator_cached (
11021097 ResolutionInfo {
11031098 module_id,
11041099 dis : disambiguator,
11051100 path_str : path_str. to_owned ( ) ,
11061101 extra_fragment,
11071102 } ,
1108- diag_info,
1103+ diag_info. clone ( ) , // this struct should really be Copy, but Range is not :(
11091104 matches ! ( ori_link. kind, LinkType :: Reference | LinkType :: Shortcut ) ,
11101105 ) ?;
11111106
@@ -1123,10 +1118,7 @@ impl LinkCollector<'_, '_> {
11231118 if fragment. is_some ( ) {
11241119 anchor_failure (
11251120 self . cx ,
1126- & item,
1127- path_str,
1128- dox,
1129- ori_link. range ,
1121+ diag_info,
11301122 AnchorFailure :: RustdocAnchorConflict ( prim) ,
11311123 ) ;
11321124 return None ;
@@ -1360,14 +1352,7 @@ impl LinkCollector<'_, '_> {
13601352 None
13611353 }
13621354 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) ;
13711356 None
13721357 }
13731358 }
@@ -1384,29 +1369,15 @@ impl LinkCollector<'_, '_> {
13841369 Ok ( res)
13851370 }
13861371 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) ;
13951373 return None ;
13961374 }
13971375 Err ( ErrorKind :: Resolve ( box kind) ) => Err ( kind) ,
13981376 } ,
13991377 value_ns : match self . resolve ( path_str, ValueNS , base_node, extra_fragment) {
14001378 Ok ( res) => Ok ( res) ,
14011379 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) ;
14101381 return None ;
14111382 }
14121383 Err ( ErrorKind :: Resolve ( box kind) ) => Err ( kind) ,
@@ -2004,10 +1975,7 @@ fn resolution_failure(
20041975/// Report an anchor failure.
20051976fn anchor_failure (
20061977 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 < ' _ > ,
20111979 failure : AnchorFailure ,
20121980) {
20131981 let msg = match failure {
0 commit comments