@@ -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