@@ -19,27 +19,7 @@ use ptr::P;
1919
2020use util:: small_vector:: SmallVector ;
2121
22- pub trait CfgFolder : fold:: Folder {
23- // Check if a node with the given attributes is in this configuration.
24- fn in_cfg ( & mut self , attrs : & [ ast:: Attribute ] ) -> bool ;
25-
26- // Update a node before checking if it is in this configuration (used to implement `cfg_attr`).
27- fn process_attrs < T : HasAttrs > ( & mut self , node : T ) -> T { node }
28-
29- // Visit attributes on expression and statements (but not attributes on items in blocks).
30- fn visit_stmt_or_expr_attrs ( & mut self , _attrs : & [ ast:: Attribute ] ) { }
31-
32- // Visit unremovable (non-optional) expressions -- c.f. `fold_expr` vs `fold_opt_expr`.
33- fn visit_unremovable_expr ( & mut self , _expr : & ast:: Expr ) { }
34-
35- fn configure < T : HasAttrs > ( & mut self , node : T ) -> Option < T > {
36- let node = self . process_attrs ( node) ;
37- if self . in_cfg ( node. attrs ( ) ) { Some ( node) } else { None }
38- }
39- }
40-
41- /// A folder that strips out items that do not belong in the current
42- /// configuration.
22+ /// A folder that strips out items that do not belong in the current configuration.
4323pub struct StripUnconfigured < ' a > {
4424 diag : CfgDiagReal < ' a , ' a > ,
4525 should_test : bool ,
@@ -59,6 +39,17 @@ impl<'a> StripUnconfigured<'a> {
5939 }
6040 }
6141
42+ fn configure < T : HasAttrs > ( & mut self , node : T ) -> Option < T > {
43+ let node = self . process_cfg_attrs ( node) ;
44+ if self . in_cfg ( node. attrs ( ) ) { Some ( node) } else { None }
45+ }
46+
47+ fn process_cfg_attrs < T : HasAttrs > ( & mut self , node : T ) -> T {
48+ node. map_attrs ( |attrs| {
49+ attrs. into_iter ( ) . filter_map ( |attr| self . process_cfg_attr ( attr) ) . collect ( )
50+ } )
51+ }
52+
6253 fn process_cfg_attr ( & mut self , attr : ast:: Attribute ) -> Option < ast:: Attribute > {
6354 if !attr. check_name ( "cfg_attr" ) {
6455 return Some ( attr) ;
@@ -92,11 +83,8 @@ impl<'a> StripUnconfigured<'a> {
9283 None
9384 }
9485 }
95- }
9686
97- impl < ' a > CfgFolder for StripUnconfigured < ' a > {
98- // Determine if an item should be translated in the current crate
99- // configuration based on the item's attributes
87+ // Determine if a node with the given attributes should be included in this configuation.
10088 fn in_cfg ( & mut self , attrs : & [ ast:: Attribute ] ) -> bool {
10189 attrs. iter ( ) . all ( |attr| {
10290 // When not compiling with --test we should not compile the #[test] functions
@@ -120,19 +108,15 @@ impl<'a> CfgFolder for StripUnconfigured<'a> {
120108 } )
121109 }
122110
123- fn process_attrs < T : HasAttrs > ( & mut self , node : T ) -> T {
124- node. map_attrs ( |attrs| {
125- attrs. into_iter ( ) . filter_map ( |attr| self . process_cfg_attr ( attr) ) . collect ( )
126- } )
127- }
128-
111+ // Visit attributes on expression and statements (but not attributes on items in blocks).
129112 fn visit_stmt_or_expr_attrs ( & mut self , attrs : & [ ast:: Attribute ] ) {
130113 // flag the offending attributes
131114 for attr in attrs. iter ( ) {
132115 self . diag . feature_gated_cfgs . push ( GatedCfgAttr :: GatedAttr ( attr. span ) ) ;
133116 }
134117 }
135118
119+ // Visit unremovable (non-optional) expressions -- c.f. `fold_expr` vs `fold_opt_expr`.
136120 fn visit_unremovable_expr ( & mut self , expr : & ast:: Expr ) {
137121 if let Some ( attr) = expr. attrs ( ) . iter ( ) . find ( |a| is_cfg ( a) || is_test_or_bench ( a) ) {
138122 let msg = "removing an expression is not supported in this position" ;
@@ -151,7 +135,7 @@ pub fn strip_unconfigured_items(diagnostic: &Handler, krate: ast::Crate, should_
151135 StripUnconfigured :: new ( config, should_test, diagnostic, feature_gated_cfgs) . fold_crate ( krate)
152136}
153137
154- impl < T : CfgFolder > fold:: Folder for T {
138+ impl < ' a > fold:: Folder for StripUnconfigured < ' a > {
155139 fn fold_foreign_mod ( & mut self , foreign_mod : ast:: ForeignMod ) -> ast:: ForeignMod {
156140 ast:: ForeignMod {
157141 abi : foreign_mod. abi ,
@@ -212,7 +196,7 @@ impl<T: CfgFolder> fold::Folder for T {
212196 // NB: This is intentionally not part of the fold_expr() function
213197 // in order for fold_opt_expr() to be able to avoid this check
214198 self . visit_unremovable_expr ( & expr) ;
215- let expr = self . process_attrs ( expr) ;
199+ let expr = self . process_cfg_attrs ( expr) ;
216200 fold_expr ( self , expr)
217201 }
218202
@@ -264,7 +248,7 @@ impl<T: CfgFolder> fold::Folder for T {
264248 }
265249}
266250
267- fn fold_expr < F : CfgFolder > ( folder : & mut F , expr : P < ast:: Expr > ) -> P < ast:: Expr > {
251+ fn fold_expr ( folder : & mut StripUnconfigured , expr : P < ast:: Expr > ) -> P < ast:: Expr > {
268252 expr. map ( |ast:: Expr { id, span, node, attrs} | {
269253 fold:: noop_fold_expr ( ast:: Expr {
270254 id : id,
0 commit comments