@@ -1500,13 +1500,11 @@ pub(crate) fn clean_middle_assoc_item<'tcx>(
1500
1500
/// or `doc(hidden)`). If it's not possible, it'll return the "end type".
1501
1501
///
1502
1502
/// If the path is not a re-export or is public, it'll return `None`.
1503
- fn first_non_private (
1504
- cx : & mut DocContext < ' _ > ,
1503
+ fn first_non_private < ' tcx > (
1504
+ cx : & mut DocContext < ' tcx > ,
1505
1505
hir_id : hir:: HirId ,
1506
- path : & hir:: Path < ' _ > ,
1506
+ path : & hir:: Path < ' tcx > ,
1507
1507
) -> Option < Path > {
1508
- use std:: mem:: transmute;
1509
-
1510
1508
let ( parent_def_id, mut ident) = match & path. segments [ ..] {
1511
1509
[ ] => return None ,
1512
1510
// Relative paths are available in the same scope as the owner.
@@ -1577,26 +1575,25 @@ fn first_non_private(
1577
1575
// 1. We found a public reexport.
1578
1576
// 2. We didn't find a public reexport so it's the "end type" path.
1579
1577
if let Some ( ( new_path, _) ) = last_path_res {
1578
+ let new_hir_path = hir:: Path {
1579
+ segments : new_path. segments ,
1580
+ res : path. res ,
1581
+ span : new_path. span ,
1582
+ } ;
1583
+ let mut new_clean_path = clean_path ( & new_hir_path, cx) ;
1580
1584
// In here we need to play with the path data one last time to provide it the
1581
1585
// missing `args` and `res` of the final `Path` we get, which, since it comes
1582
1586
// from a re-export, doesn't have the generics that were originally there, so
1583
1587
// we add them by hand.
1584
- let mut segments = new_path. segments . to_vec ( ) ;
1585
- if let Some ( last) = segments. last_mut ( ) {
1586
- // `transmute` is needed because we are using a wrong lifetime. Since
1587
- // `segments` will be dropped at the end of this block, it's fine.
1588
- last. args = unsafe {
1589
- transmute (
1590
- path. segments . last ( ) . as_ref ( ) . unwrap ( ) . args . clone ( ) ,
1591
- )
1592
- } ;
1593
- last. res = path. res ;
1588
+ if let Some ( path_last) = path. segments . last ( ) . as_ref ( )
1589
+ && let Some ( new_path_last) = new_clean_path. segments [ ..] . last_mut ( )
1590
+ && let Some ( path_last_args) = path_last. args . as_ref ( )
1591
+ && path_last. args . is_some ( )
1592
+ {
1593
+ assert ! ( new_path_last. args. is_empty( ) ) ;
1594
+ new_path_last. args = clean_generic_args ( path_last_args, cx) ;
1594
1595
}
1595
- // `transmute` is needed because we are using a wrong lifetime. Since
1596
- // `segments` will be dropped at the end of this block, it's fine.
1597
- let segments = unsafe { transmute ( segments. as_slice ( ) ) } ;
1598
- let new_path = hir:: Path { segments, res : path. res , span : new_path. span } ;
1599
- return Some ( clean_path ( & new_path, cx) ) ;
1596
+ return Some ( new_clean_path) ;
1600
1597
}
1601
1598
// If `last_path_res` is `None`, it can mean two things:
1602
1599
//
0 commit comments