@@ -3,7 +3,7 @@ use std::sync::Arc;
3
3
4
4
use crate :: clean:: cfg:: Cfg ;
5
5
use crate :: clean:: inline:: { load_attrs, merge_attrs} ;
6
- use crate :: clean:: { Crate , Item } ;
6
+ use crate :: clean:: { Crate , Item , ItemKind } ;
7
7
use crate :: core:: DocContext ;
8
8
use crate :: fold:: DocFolder ;
9
9
use crate :: passes:: Pass ;
@@ -26,30 +26,50 @@ struct CfgPropagator<'a, 'tcx> {
26
26
cx : & ' a mut DocContext < ' tcx > ,
27
27
}
28
28
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
+ } ;
32
40
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 {
37
48
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
+ }
38
55
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 ( ) ) ) ;
51
60
}
52
61
}
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
+
53
73
let new_cfg = match ( self . parent_cfg . take ( ) , item. cfg . take ( ) ) {
54
74
( None , None ) => None ,
55
75
( Some ( rc) , None ) | ( None , Some ( rc) ) => Some ( rc) ,
0 commit comments