@@ -504,15 +504,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
504
504
match res {
505
505
// FIXME(#76467): make this fallthrough to lookup the associated
506
506
// item a separate function.
507
- Res :: Def ( DefKind :: AssocFn | DefKind :: AssocConst , _) => {
508
- assert_eq ! ( ns, ValueNS ) ;
509
- }
510
- Res :: Def ( DefKind :: AssocTy , _) => {
511
- assert_eq ! ( ns, TypeNS ) ;
512
- }
513
- Res :: Def ( DefKind :: Variant , _) => {
514
- return handle_variant ( cx, res, extra_fragment) ;
515
- }
507
+ Res :: Def ( DefKind :: AssocFn | DefKind :: AssocConst , _) => assert_eq ! ( ns, ValueNS ) ,
508
+ Res :: Def ( DefKind :: AssocTy , _) => assert_eq ! ( ns, TypeNS ) ,
509
+ Res :: Def ( DefKind :: Variant , _) => return handle_variant ( cx, res, extra_fragment) ,
516
510
// Not a trait item; just return what we found.
517
511
Res :: Primitive ( ty) => {
518
512
if extra_fragment. is_some ( ) {
@@ -522,12 +516,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
522
516
}
523
517
return Ok ( ( res, Some ( ty. as_str ( ) . to_owned ( ) ) ) ) ;
524
518
}
525
- Res :: Def ( DefKind :: Mod , _) => {
526
- return Ok ( ( res, extra_fragment. clone ( ) ) ) ;
527
- }
528
- _ => {
529
- return Ok ( ( res, extra_fragment. clone ( ) ) ) ;
530
- }
519
+ _ => return Ok ( ( res, extra_fragment. clone ( ) ) ) ,
531
520
}
532
521
}
533
522
@@ -1024,12 +1013,18 @@ impl LinkCollector<'_, '_> {
1024
1013
1025
1014
let resolved_self;
1026
1015
// replace `Self` with suitable item's parent name
1027
- if path_str. starts_with ( "Self::" ) {
1016
+ let is_lone_self = path_str == "Self" ;
1017
+ let is_lone_crate = path_str == "crate" ;
1018
+ if path_str. starts_with ( "Self::" ) || is_lone_self {
1028
1019
if let Some ( ref name) = self_name {
1029
- resolved_self = format ! ( "{}::{}" , name, & path_str[ 6 ..] ) ;
1030
- path_str = & resolved_self;
1020
+ if is_lone_self {
1021
+ path_str = name;
1022
+ } else {
1023
+ resolved_self = format ! ( "{}::{}" , name, & path_str[ 6 ..] ) ;
1024
+ path_str = & resolved_self;
1025
+ }
1031
1026
}
1032
- } else if path_str. starts_with ( "crate::" ) {
1027
+ } else if path_str. starts_with ( "crate::" ) || is_lone_crate {
1033
1028
use rustc_span:: def_id:: CRATE_DEF_INDEX ;
1034
1029
1035
1030
// HACK(jynelson): rustc_resolve thinks that `crate` is the crate currently being documented.
@@ -1038,8 +1033,12 @@ impl LinkCollector<'_, '_> {
1038
1033
// HACK(jynelson)(2): If we just strip `crate::` then suddenly primitives become ambiguous
1039
1034
// (consider `crate::char`). Instead, change it to `self::`. This works because 'self' is now the crate root.
1040
1035
// FIXME(#78696): This doesn't always work.
1041
- resolved_self = format ! ( "self::{}" , & path_str[ "crate::" . len( ) ..] ) ;
1042
- path_str = & resolved_self;
1036
+ if is_lone_crate {
1037
+ path_str = "self" ;
1038
+ } else {
1039
+ resolved_self = format ! ( "self::{}" , & path_str[ "crate::" . len( ) ..] ) ;
1040
+ path_str = & resolved_self;
1041
+ }
1043
1042
module_id = DefId { krate, index : CRATE_DEF_INDEX } ;
1044
1043
}
1045
1044
0 commit comments