@@ -950,6 +950,7 @@ impl LinkCollector<'_, '_> {
950
950
}
951
951
952
952
let link = ori_link. link . replace ( "`" , "" ) ;
953
+ let no_backticks_range = range_between_backticks ( & ori_link) ;
953
954
let parts = link. split ( '#' ) . collect :: < Vec < _ > > ( ) ;
954
955
let ( link, extra_fragment) = if parts. len ( ) > 2 {
955
956
// A valid link can't have multiple #'s
@@ -976,8 +977,10 @@ impl LinkCollector<'_, '_> {
976
977
let ( mut path_str, disambiguator) = match Disambiguator :: from_str ( & link) {
977
978
Ok ( Some ( ( d, path) ) ) => ( path. trim ( ) , Some ( d) ) ,
978
979
Ok ( None ) => ( link. trim ( ) , None ) ,
979
- Err ( err_msg) => {
980
- disambiguator_error ( self . cx , & item, dox, ori_link. range , & err_msg) ;
980
+ Err ( ( err_msg, relative_range) ) => {
981
+ let disambiguator_range = ( no_backticks_range. start + relative_range. start )
982
+ ..( no_backticks_range. start + relative_range. end ) ;
983
+ disambiguator_error ( self . cx , & item, dox, disambiguator_range, & err_msg) ;
981
984
return None ;
982
985
}
983
986
} ;
@@ -1491,6 +1494,27 @@ impl LinkCollector<'_, '_> {
1491
1494
}
1492
1495
}
1493
1496
1497
+ /// Get the section of a link between the backticks,
1498
+ /// or the whole link if there aren't any backticks.
1499
+ ///
1500
+ /// For example:
1501
+ ///
1502
+ /// ```text
1503
+ /// [`Foo`]
1504
+ /// ^^^
1505
+ /// ```
1506
+ fn range_between_backticks ( ori_link : & MarkdownLink ) -> Range < usize > {
1507
+ let after_first_backtick_group = ori_link. link . bytes ( ) . position ( |b| b != b'`' ) . unwrap_or ( 0 ) ;
1508
+ let before_second_backtick_group = ori_link
1509
+ . link
1510
+ . bytes ( )
1511
+ . skip ( after_first_backtick_group)
1512
+ . position ( |b| b == b'`' )
1513
+ . unwrap_or ( ori_link. link . len ( ) ) ;
1514
+ ( ori_link. range . start + after_first_backtick_group)
1515
+ ..( ori_link. range . start + before_second_backtick_group)
1516
+ }
1517
+
1494
1518
#[ derive( Copy , Clone , Debug , PartialEq , Eq , Hash ) ]
1495
1519
/// Disambiguators for a link.
1496
1520
enum Disambiguator {
@@ -1522,7 +1546,7 @@ impl Disambiguator {
1522
1546
/// This returns `Ok(Some(...))` if a disambiguator was found,
1523
1547
/// `Ok(None)` if no disambiguator was found, or `Err(...)`
1524
1548
/// if there was a problem with the disambiguator.
1525
- fn from_str ( link : & str ) -> Result < Option < ( Self , & str ) > , String > {
1549
+ fn from_str ( link : & str ) -> Result < Option < ( Self , & str ) > , ( String , Range < usize > ) > {
1526
1550
use Disambiguator :: { Kind , Namespace as NS , Primitive } ;
1527
1551
1528
1552
let find_suffix = || {
@@ -1558,7 +1582,7 @@ impl Disambiguator {
1558
1582
"value" => NS ( Namespace :: ValueNS ) ,
1559
1583
"macro" => NS ( Namespace :: MacroNS ) ,
1560
1584
"prim" | "primitive" => Primitive ,
1561
- _ => return Err ( format ! ( "unknown disambiguator `{}`" , prefix) ) ,
1585
+ _ => return Err ( ( format ! ( "unknown disambiguator `{}`" , prefix) , 0 ..idx ) ) ,
1562
1586
} ;
1563
1587
Ok ( Some ( ( d, & rest[ 1 ..] ) ) )
1564
1588
} else {
@@ -1994,12 +2018,7 @@ fn disambiguator_error(
1994
2018
link_range : Range < usize > ,
1995
2019
msg : & str ,
1996
2020
) {
1997
- report_diagnostic ( cx. tcx , BROKEN_INTRA_DOC_LINKS , msg, item, dox, & link_range, |diag, _sp| {
1998
- diag. note (
1999
- "the disambiguator is the part of the link before the `@` sign, \
2000
- or a suffix such as `()` for functions",
2001
- ) ;
2002
- } ) ;
2021
+ report_diagnostic ( cx. tcx , BROKEN_INTRA_DOC_LINKS , msg, item, dox, & link_range, |_diag, _sp| { } ) ;
2003
2022
}
2004
2023
2005
2024
/// Report an ambiguity error, where there were multiple possible resolutions.
0 commit comments