@@ -3,7 +3,7 @@ use std::sync::Arc;
33
44use  crate :: clean:: cfg:: Cfg ; 
55use  crate :: clean:: inline:: { load_attrs,  merge_attrs} ; 
6- use  crate :: clean:: { Crate ,  Item } ; 
6+ use  crate :: clean:: { Crate ,  Item ,   ItemKind } ; 
77use  crate :: core:: DocContext ; 
88use  crate :: fold:: DocFolder ; 
99use  crate :: passes:: Pass ; 
@@ -26,30 +26,50 @@ struct CfgPropagator<'a, 'tcx> {
2626    cx :  & ' a  mut  DocContext < ' tcx > , 
2727} 
2828
29- impl < ' a ,  ' tcx >  DocFolder  for  CfgPropagator < ' a ,  ' tcx >  { 
30-     fn  fold_item ( & mut  self ,  mut  item :  Item )  -> Option < Item >  { 
31-         let  old_parent_cfg = self . parent_cfg . clone ( ) ; 
29+ impl < ' a ,  ' tcx >  CfgPropagator < ' a ,  ' tcx >  { 
30+     // Some items need to merge their attributes with their parents' otherwise a few of them 
31+     // (mostly `cfg` ones) will be missing. 
32+     fn  merge_with_parent_attributes ( & mut  self ,  item :  & mut  Item )  { 
33+         let  check_parent = match  & * item. kind  { 
34+             // impl blocks can be in different modules with different cfg and we need to get them 
35+             // as well. 
36+             ItemKind :: ImplItem ( _)  => false , 
37+             kind if  kind. is_non_assoc ( )  => true , 
38+             _ => return , 
39+         } ; 
3240
33-         if  item. kind . is_non_assoc ( )  &&
34-             let  Some ( def_id)  = item. item_id . as_def_id ( ) . and_then ( |def_id| def_id. as_local ( ) )  { 
35-             let  hir = self . cx . tcx . hir ( ) ; 
36-             let  hir_id = hir. local_def_id_to_hir_id ( def_id) ; 
41+         let  Some ( def_id)  = item. item_id . as_def_id ( ) . and_then ( |def_id| def_id. as_local ( ) ) 
42+             else  {  return  } ; 
43+ 
44+         let  hir = self . cx . tcx . hir ( ) ; 
45+         let  hir_id = hir. local_def_id_to_hir_id ( def_id) ; 
46+ 
47+         if  check_parent { 
3748            let  expected_parent = hir. get_parent_item ( hir_id) ; 
49+             // If parents are different, it means that `item` is a reexport and we need 
50+             // to compute the actual `cfg` by iterating through its "real" parents. 
51+             if  self . parent  == Some ( expected_parent)  { 
52+                 return ; 
53+             } 
54+         } 
3855
39-             // If parents are different, it means that `item` is a reexport and we need to compute 
40-             // the actual `cfg` by iterating through its "real" parents. 
41-             if  self . parent  != Some ( expected_parent)  { 
42-                 let  mut  attrs = Vec :: new ( ) ; 
43-                 for  ( parent_hir_id,  _)  in  hir. parent_iter ( hir_id)  { 
44-                     if  let  Some ( def_id)  = hir. opt_local_def_id ( parent_hir_id)  { 
45-                         attrs. extend_from_slice ( load_attrs ( self . cx ,  def_id. to_def_id ( ) ) ) ; 
46-                     } 
47-                 } 
48-                 let  ( _,  cfg)  =
49-                     merge_attrs ( self . cx ,  None ,  item. attrs . other_attrs . as_slice ( ) ,  Some ( & attrs) ) ; 
50-                 item. cfg  = cfg; 
56+         let  mut  attrs = Vec :: new ( ) ; 
57+         for  ( parent_hir_id,  _)  in  hir. parent_iter ( hir_id)  { 
58+             if  let  Some ( def_id)  = hir. opt_local_def_id ( parent_hir_id)  { 
59+                 attrs. extend_from_slice ( load_attrs ( self . cx ,  def_id. to_def_id ( ) ) ) ; 
5160            } 
5261        } 
62+         let  ( _,  cfg)  = merge_attrs ( self . cx ,  None ,  item. attrs . other_attrs . as_slice ( ) ,  Some ( & attrs) ) ; 
63+         item. cfg  = cfg; 
64+     } 
65+ } 
66+ 
67+ impl < ' a ,  ' tcx >  DocFolder  for  CfgPropagator < ' a ,  ' tcx >  { 
68+     fn  fold_item ( & mut  self ,  mut  item :  Item )  -> Option < Item >  { 
69+         let  old_parent_cfg = self . parent_cfg . clone ( ) ; 
70+ 
71+         self . merge_with_parent_attributes ( & mut  item) ; 
72+ 
5373        let  new_cfg = match  ( self . parent_cfg . take ( ) ,  item. cfg . take ( ) )  { 
5474            ( None ,  None )  => None , 
5575            ( Some ( rc) ,  None )  | ( None ,  Some ( rc) )  => Some ( rc) , 
0 commit comments