@@ -24,61 +24,60 @@ crate fn expand(
2424 annotatable : Annotatable ,
2525) -> Vec < Annotatable > {
2626 check_builtin_macro_attribute ( ecx, meta_item, sym:: cfg_eval) ;
27- cfg_eval ( ecx, annotatable)
27+ vec ! [ cfg_eval( ecx, annotatable) ]
2828}
2929
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 {
3232 cfg : & mut StripUnconfigured {
3333 sess : ecx. sess ,
3434 features : ecx. ecfg . features ,
3535 config_tokens : true ,
3636 } ,
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 ( )
4042}
4143
4244struct CfgEval < ' a , ' b > {
4345 cfg : & ' a mut StripUnconfigured < ' b > ,
4446}
4547
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 > {
4952 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 ) ,
5154 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 )
5356 }
5457 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 )
5659 }
5760 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 )
5962 }
6063 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 )
6265 }
63- Annotatable :: Expr ( mut expr) => Annotatable :: Expr ( {
66+ Annotatable :: Expr ( mut expr) => {
6467 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) )
7069 }
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 )
7373 }
74+ Annotatable :: PatField ( fp) => vis. flat_map_pat_field ( fp) . pop ( ) . map ( Annotatable :: PatField ) ,
7475 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 )
8077 }
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 ) ,
8281 }
8382}
8483
@@ -123,11 +122,11 @@ impl CfgEval<'_, '_> {
123122 self . cfg . configure ( node)
124123 }
125124
126- pub fn configure_annotatable ( & mut self , mut annotatable : Annotatable ) -> Annotatable {
125+ fn configure_annotatable ( & mut self , mut annotatable : Annotatable ) -> Option < Annotatable > {
127126 // Tokenizing and re-parsing the `Annotatable` can have a significant
128127 // performance impact, so try to avoid it if possible
129128 if !CfgFinder :: has_cfg_or_cfg_attr ( & annotatable) {
130- return annotatable;
129+ return Some ( annotatable) ;
131130 }
132131
133132 // The majority of parsed attribute targets will never need to have early cfg-expansion
0 commit comments