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