@@ -24,61 +24,60 @@ crate fn expand(
24
24
annotatable : Annotatable ,
25
25
) -> Vec < Annotatable > {
26
26
check_builtin_macro_attribute ( ecx, meta_item, sym:: cfg_eval) ;
27
- cfg_eval ( ecx, annotatable)
27
+ vec ! [ cfg_eval( ecx, annotatable) ]
28
28
}
29
29
30
- crate fn cfg_eval ( ecx : & ExtCtxt < ' _ > , annotatable : Annotatable ) -> Vec < Annotatable > {
31
- let mut visitor = CfgEval {
30
+ crate fn cfg_eval ( ecx : & ExtCtxt < ' _ > , annotatable : Annotatable ) -> Annotatable {
31
+ CfgEval {
32
32
cfg : & mut StripUnconfigured {
33
33
sess : ecx. sess ,
34
34
features : ecx. ecfg . features ,
35
35
config_tokens : true ,
36
36
} ,
37
- } ;
38
- let annotatable = visitor. configure_annotatable ( annotatable) ;
39
- vec ! [ annotatable]
37
+ }
38
+ . configure_annotatable ( annotatable)
39
+ // Since the item itself has already been configured by the `InvocationCollector`,
40
+ // we know that fold result vector will contain exactly one element.
41
+ . unwrap ( )
40
42
}
41
43
42
44
struct CfgEval < ' a , ' b > {
43
45
cfg : & ' a mut StripUnconfigured < ' b > ,
44
46
}
45
47
46
- fn flat_map_annotatable ( vis : & mut impl MutVisitor , annotatable : Annotatable ) -> Annotatable {
47
- // Since the item itself has already been configured by the InvocationCollector,
48
- // we know that fold result vector will contain exactly one element
48
+ fn flat_map_annotatable (
49
+ vis : & mut impl MutVisitor ,
50
+ annotatable : Annotatable ,
51
+ ) -> Option < Annotatable > {
49
52
match annotatable {
50
- Annotatable :: Item ( item) => Annotatable :: Item ( vis. flat_map_item ( item) . pop ( ) . unwrap ( ) ) ,
53
+ Annotatable :: Item ( item) => vis. flat_map_item ( item) . pop ( ) . map ( Annotatable :: Item ) ,
51
54
Annotatable :: TraitItem ( item) => {
52
- Annotatable :: TraitItem ( vis. flat_map_trait_item ( item) . pop ( ) . unwrap ( ) )
55
+ vis. flat_map_trait_item ( item) . pop ( ) . map ( Annotatable :: TraitItem )
53
56
}
54
57
Annotatable :: ImplItem ( item) => {
55
- Annotatable :: ImplItem ( vis. flat_map_impl_item ( item) . pop ( ) . unwrap ( ) )
58
+ vis. flat_map_impl_item ( item) . pop ( ) . map ( Annotatable :: ImplItem )
56
59
}
57
60
Annotatable :: ForeignItem ( item) => {
58
- Annotatable :: ForeignItem ( vis. flat_map_foreign_item ( item) . pop ( ) . unwrap ( ) )
61
+ vis. flat_map_foreign_item ( item) . pop ( ) . map ( Annotatable :: ForeignItem )
59
62
}
60
63
Annotatable :: Stmt ( stmt) => {
61
- Annotatable :: Stmt ( stmt . map ( |stmt| vis. flat_map_stmt ( stmt) . pop ( ) . unwrap ( ) ) )
64
+ vis. flat_map_stmt ( stmt. into_inner ( ) ) . pop ( ) . map ( P ) . map ( Annotatable :: Stmt )
62
65
}
63
- Annotatable :: Expr ( mut expr) => Annotatable :: Expr ( {
66
+ Annotatable :: Expr ( mut expr) => {
64
67
vis. visit_expr ( & mut expr) ;
65
- expr
66
- } ) ,
67
- Annotatable :: Arm ( arm) => Annotatable :: Arm ( vis. flat_map_arm ( arm) . pop ( ) . unwrap ( ) ) ,
68
- Annotatable :: ExprField ( field) => {
69
- Annotatable :: ExprField ( vis. flat_map_expr_field ( field) . pop ( ) . unwrap ( ) )
68
+ Some ( Annotatable :: Expr ( expr) )
70
69
}
71
- Annotatable :: PatField ( fp) => {
72
- Annotatable :: PatField ( vis. flat_map_pat_field ( fp) . pop ( ) . unwrap ( ) )
70
+ Annotatable :: Arm ( arm) => vis. flat_map_arm ( arm) . pop ( ) . map ( Annotatable :: Arm ) ,
71
+ Annotatable :: ExprField ( field) => {
72
+ vis. flat_map_expr_field ( field) . pop ( ) . map ( Annotatable :: ExprField )
73
73
}
74
+ Annotatable :: PatField ( fp) => vis. flat_map_pat_field ( fp) . pop ( ) . map ( Annotatable :: PatField ) ,
74
75
Annotatable :: GenericParam ( param) => {
75
- Annotatable :: GenericParam ( vis. flat_map_generic_param ( param) . pop ( ) . unwrap ( ) )
76
- }
77
- Annotatable :: Param ( param) => Annotatable :: Param ( vis. flat_map_param ( param) . pop ( ) . unwrap ( ) ) ,
78
- Annotatable :: FieldDef ( sf) => {
79
- Annotatable :: FieldDef ( vis. flat_map_field_def ( sf) . pop ( ) . unwrap ( ) )
76
+ vis. flat_map_generic_param ( param) . pop ( ) . map ( Annotatable :: GenericParam )
80
77
}
81
- Annotatable :: Variant ( v) => Annotatable :: Variant ( vis. flat_map_variant ( v) . pop ( ) . unwrap ( ) ) ,
78
+ Annotatable :: Param ( param) => vis. flat_map_param ( param) . pop ( ) . map ( Annotatable :: Param ) ,
79
+ Annotatable :: FieldDef ( sf) => vis. flat_map_field_def ( sf) . pop ( ) . map ( Annotatable :: FieldDef ) ,
80
+ Annotatable :: Variant ( v) => vis. flat_map_variant ( v) . pop ( ) . map ( Annotatable :: Variant ) ,
82
81
}
83
82
}
84
83
@@ -123,11 +122,11 @@ impl CfgEval<'_, '_> {
123
122
self . cfg . configure ( node)
124
123
}
125
124
126
- pub fn configure_annotatable ( & mut self , mut annotatable : Annotatable ) -> Annotatable {
125
+ fn configure_annotatable ( & mut self , mut annotatable : Annotatable ) -> Option < Annotatable > {
127
126
// Tokenizing and re-parsing the `Annotatable` can have a significant
128
127
// performance impact, so try to avoid it if possible
129
128
if !CfgFinder :: has_cfg_or_cfg_attr ( & annotatable) {
130
- return annotatable;
129
+ return Some ( annotatable) ;
131
130
}
132
131
133
132
// The majority of parsed attribute targets will never need to have early cfg-expansion
0 commit comments