@@ -992,9 +992,9 @@ fn preprocess_link<'a>(
992992    } 
993993
994994    // Parse and strip the disambiguator from the link, if present. 
995-     let  ( path_str,  disambiguator )  = match  Disambiguator :: from_str ( & link)  { 
996-         Ok ( Some ( ( d,  path) ) )  => ( path. trim ( ) ,  Some ( d ) ) , 
997-         Ok ( None )  => ( link. trim ( ) ,  None ) , 
995+     let  ( disambiguator ,   path_str,  link_text )  = match  Disambiguator :: from_str ( & link)  { 
996+         Ok ( Some ( ( d,  path,  link_text ) ) )  => ( Some ( d ) ,   path. trim ( ) ,  link_text . trim ( ) ) , 
997+         Ok ( None )  => ( None ,   link. trim ( ) ,  link . trim ( ) ) , 
998998        Err ( ( err_msg,  relative_range) )  => { 
999999            // Only report error if we would not have ignored this link. See issue #83859. 
10001000            if  !should_ignore_link_with_disambiguators ( link)  { 
@@ -1012,11 +1012,6 @@ fn preprocess_link<'a>(
10121012        return  None ; 
10131013    } 
10141014
1015-     // We stripped `()` and `!` when parsing the disambiguator. 
1016-     // Add them back to be displayed, but not prefix disambiguators. 
1017-     let  link_text =
1018-         disambiguator. map ( |d| d. display_for ( path_str) ) . unwrap_or_else ( || path_str. to_owned ( ) ) ; 
1019- 
10201015    // Strip generics from the path. 
10211016    let  path_str = if  path_str. contains ( [ '<' ,  '>' ] . as_slice ( ) )  { 
10221017        match  strip_generics_from_path ( & path_str)  { 
@@ -1046,7 +1041,7 @@ fn preprocess_link<'a>(
10461041        path_str, 
10471042        disambiguator, 
10481043        extra_fragment :  extra_fragment. map ( String :: from) , 
1049-         link_text, 
1044+         link_text :  link_text . to_owned ( ) , 
10501045    } ) ) 
10511046} 
10521047
@@ -1554,24 +1549,12 @@ enum Disambiguator {
15541549} 
15551550
15561551impl  Disambiguator  { 
1557-     /// The text that should be displayed when the path is rendered as HTML. 
1558- /// 
1559- /// NOTE: `path` is not the original link given by the user, but a name suitable for passing to `resolve`. 
1560- fn  display_for ( & self ,  path :  & str )  -> String  { 
1561-         match  self  { 
1562-             // FIXME: this will have different output if the user had `m!()` originally. 
1563-             Self :: Kind ( DefKind :: Macro ( MacroKind :: Bang ) )  => format ! ( "{}!" ,  path) , 
1564-             Self :: Kind ( DefKind :: Fn )  => format ! ( "{}()" ,  path) , 
1565-             _ => path. to_owned ( ) , 
1566-         } 
1567-     } 
1568- 
1569-     /// Given a link, parse and return `(disambiguator, path_str)`. 
1552+     /// Given a link, parse and return `(disambiguator, path_str, link_text)`. 
15701553/// 
15711554/// This returns `Ok(Some(...))` if a disambiguator was found, 
15721555/// `Ok(None)` if no disambiguator was found, or `Err(...)` 
15731556/// if there was a problem with the disambiguator. 
1574- fn  from_str ( link :  & str )  -> Result < Option < ( Self ,  & str ) > ,  ( String ,  Range < usize > ) >  { 
1557+ fn  from_str ( link :  & str )  -> Result < Option < ( Self ,  & str ,   & str ) > ,  ( String ,  Range < usize > ) >  { 
15751558        use  Disambiguator :: { Kind ,  Namespace  as  NS ,  Primitive } ; 
15761559
15771560        if  let  Some ( idx)  = link. find ( '@' )  { 
@@ -1592,18 +1575,20 @@ impl Disambiguator {
15921575                "prim"  | "primitive"  => Primitive , 
15931576                _ => return  Err ( ( format ! ( "unknown disambiguator `{}`" ,  prefix) ,  0 ..idx) ) , 
15941577            } ; 
1595-             Ok ( Some ( ( d,  & rest[ 1 ..] ) ) ) 
1578+             Ok ( Some ( ( d,  & rest[ 1 ..] ,   & rest [ 1 .. ] ) ) ) 
15961579        }  else  { 
15971580            let  suffixes = [ 
15981581                ( "!()" ,  DefKind :: Macro ( MacroKind :: Bang ) ) , 
1582+                 ( "!{}" ,  DefKind :: Macro ( MacroKind :: Bang ) ) , 
1583+                 ( "![]" ,  DefKind :: Macro ( MacroKind :: Bang ) ) , 
15991584                ( "()" ,  DefKind :: Fn ) , 
16001585                ( "!" ,  DefKind :: Macro ( MacroKind :: Bang ) ) , 
16011586            ] ; 
16021587            for  ( suffix,  kind)  in  suffixes { 
1603-                 if  let  Some ( link )  = link. strip_suffix ( suffix)  { 
1588+                 if  let  Some ( path_str )  = link. strip_suffix ( suffix)  { 
16041589                    // Avoid turning `!` or `()` into an empty string 
1605-                     if  !link . is_empty ( )  { 
1606-                         return  Ok ( Some ( ( Kind ( kind) ,  link) ) ) ; 
1590+                     if  !path_str . is_empty ( )  { 
1591+                         return  Ok ( Some ( ( Kind ( kind) ,  path_str ,   link) ) ) ; 
16071592                    } 
16081593                } 
16091594            } 
0 commit comments