@@ -178,6 +178,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
178
178
let result = cx. enter_resolver ( |resolver| {
179
179
resolver. resolve_str_path_error ( DUMMY_SP , & path_str, ns, module_id)
180
180
} ) ;
181
+ debug ! ( "{} resolved to {:?} in namespace {:?}" , path_str, ns, result) ;
181
182
let result = match result {
182
183
Ok ( ( _, Res :: Err ) ) => Err ( ErrorKind :: ResolutionFailure ) ,
183
184
_ => result. map_err ( |_| ErrorKind :: ResolutionFailure ) ,
@@ -202,7 +203,11 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
202
203
}
203
204
return Ok ( ( res, Some ( path_str. to_owned ( ) ) ) ) ;
204
205
}
205
- _ => return Ok ( ( res, extra_fragment. clone ( ) ) ) ,
206
+ other => {
207
+ debug ! ( "failed to resolve {} in namespace {:?} (got {:?})" , path_str, ns, other) ;
208
+ debug ! ( "extra_fragment is {:?}" , extra_fragment) ;
209
+ return Ok ( ( res, extra_fragment. clone ( ) ) ) ;
210
+ }
206
211
} ;
207
212
208
213
if value != ( ns == ValueNS ) {
@@ -555,9 +560,11 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
555
560
} else {
556
561
( parts[ 0 ] . to_owned ( ) , None )
557
562
} ;
563
+ let resolved_self;
564
+ let mut path_str;
558
565
let ( res, fragment) = {
559
566
let mut kind = None ;
560
- let mut path_str = if let Some ( prefix) =
567
+ path_str = if let Some ( prefix) =
561
568
[ "struct@" , "enum@" , "type@" , "trait@" , "union@" ]
562
569
. iter ( )
563
570
. find ( |p| link. starts_with ( * * p) )
@@ -614,7 +621,6 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
614
621
let base_node =
615
622
if item. is_mod ( ) && item. attrs . inner_docs { None } else { parent_node } ;
616
623
617
- let resolved_self;
618
624
// replace `Self` with suitable item's parent name
619
625
if path_str. starts_with ( "Self::" ) {
620
626
if let Some ( ref name) = parent_name {
@@ -760,6 +766,24 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
760
766
if let Res :: PrimTy ( _) = res {
761
767
item. attrs . links . push ( ( ori_link, None , fragment) ) ;
762
768
} else {
769
+ // ~~WRONG: TODO: I think this happens too late and we need to instead put this in `self.resolve`~~
770
+ debug ! ( "item {:?} resolved to {:?}" , item, res) ;
771
+ if let Some ( local) = res. opt_def_id ( ) . and_then ( |def_id| def_id. as_local ( ) ) {
772
+ let hir_id = self . cx . tcx . hir ( ) . as_local_hir_id ( local) ;
773
+ if !self . cx . tcx . privacy_access_levels ( rustc_hir:: def_id:: LOCAL_CRATE ) . is_exported ( hir_id) {
774
+ let item_name = item. name . as_deref ( ) . unwrap_or ( "<unknown>" ) ;
775
+ build_diagnostic (
776
+ cx,
777
+ & item,
778
+ path_str,
779
+ & dox,
780
+ link_range,
781
+ & format ! ( "public documentation for `{}` links to a private item" , item_name) ,
782
+ "this item is private" ,
783
+ None ,
784
+ ) ;
785
+ }
786
+ }
763
787
let id = register_res ( cx, res) ;
764
788
item. attrs . links . push ( ( ori_link, Some ( id) , fragment) ) ;
765
789
}
0 commit comments