about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-05-15 09:22:58 +0000
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-05-26 23:23:11 +0000
commita306f85df9f75c35c88395be756dc09c73cab891 (patch)
tree0b6ed5e8050435587f2cc2f8ac85794d3f494eb6 /src/libsyntax
parentf3e80760e9e7ceaa40661e07e0c89e1739f68d9a (diff)
downloadrust-a306f85df9f75c35c88395be756dc09c73cab891.tar.gz
rust-a306f85df9f75c35c88395be756dc09c73cab891.zip
Implement `CfgFolder` directly instead of passing a closure to `strip_items`
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/config.rs41
-rw-r--r--src/libsyntax/test.rs22
2 files changed, 29 insertions, 34 deletions
diff --git a/src/libsyntax/config.rs b/src/libsyntax/config.rs
index a22e08d4275..1948c3afdbd 100644
--- a/src/libsyntax/config.rs
+++ b/src/libsyntax/config.rs
@@ -26,14 +26,14 @@ pub trait CfgFolder: fold::Folder {
 
 /// A folder that strips out items that do not belong in the current
 /// configuration.
-struct Context<'a, F> where F: FnMut(&[ast::Attribute]) -> bool {
-    in_cfg: F,
-    diagnostic: &'a Handler,
+pub struct StripUnconfigured<'a> {
+    diag: CfgDiagReal<'a, 'a>,
+    config: &'a ast::CrateConfig,
 }
 
-impl<'a, F: FnMut(&[ast::Attribute]) -> bool> CfgFolder for Context<'a, F> {
+impl<'a> CfgFolder for StripUnconfigured<'a> {
     fn configure<T: HasAttrs>(&mut self, node: T) -> Option<T> {
-        if (self.in_cfg)(node.attrs()) {
+        if in_cfg(self.config, node.attrs(), &mut self.diag) {
             Some(node)
         } else {
             None
@@ -43,7 +43,7 @@ impl<'a, F: FnMut(&[ast::Attribute]) -> bool> CfgFolder for Context<'a, F> {
     fn visit_unconfigurable_expr(&mut self, expr: &ast::Expr) {
         if let Some(attr) = expr.attrs().iter().find(|a| is_cfg(a)) {
             let msg = "removing an expression is not supported in this position";
-            self.diagnostic.span_err(attr.span, msg);
+            self.diag.diag.span_err(attr.span, msg);
         }
     }
 }
@@ -58,16 +58,14 @@ pub fn strip_unconfigured_items(diagnostic: &Handler, krate: ast::Crate,
     check_for_gated_stmt_expr_attributes(&krate, feature_gated_cfgs);
 
     let krate = process_cfg_attr(diagnostic, krate, feature_gated_cfgs);
-    let config = krate.config.clone();
-    strip_items(diagnostic,
-                krate,
-                |attrs| {
-                    let mut diag = CfgDiagReal {
-                        diag: diagnostic,
-                        feature_gated_cfgs: feature_gated_cfgs,
-                    };
-                    in_cfg(&config, attrs, &mut diag)
-                })
+
+    StripUnconfigured {
+        config: &krate.config.clone(),
+        diag: CfgDiagReal {
+            diag: diagnostic,
+            feature_gated_cfgs: feature_gated_cfgs,
+        },
+    }.fold_crate(krate)
 }
 
 impl<T: CfgFolder> fold::Folder for T {
@@ -158,17 +156,6 @@ impl<T: CfgFolder> fold::Folder for T {
     }
 }
 
-pub fn strip_items<'a, F>(diagnostic: &'a Handler,
-                          krate: ast::Crate, in_cfg: F) -> ast::Crate where
-    F: FnMut(&[ast::Attribute]) -> bool,
-{
-    let mut ctxt = Context {
-        in_cfg: in_cfg,
-        diagnostic: diagnostic,
-    };
-    ctxt.fold_crate(krate)
-}
-
 fn fold_expr<F: CfgFolder>(folder: &mut F, expr: P<ast::Expr>) -> P<ast::Expr> {
     expr.map(|ast::Expr {id, span, node, attrs}| {
         fold::noop_fold_expr(ast::Expr {
diff --git a/src/libsyntax/test.rs b/src/libsyntax/test.rs
index 8eeb61e0de4..84c7250fac6 100644
--- a/src/libsyntax/test.rs
+++ b/src/libsyntax/test.rs
@@ -87,7 +87,7 @@ pub fn modify_for_testing(sess: &ParseSess,
     if should_test {
         generate_test_harness(sess, reexport_test_harness_main, krate, cfg, span_diagnostic)
     } else {
-        strip_test_functions(span_diagnostic, krate)
+        strip_test_functions(krate)
     }
 }
 
@@ -312,14 +312,22 @@ fn generate_test_harness(sess: &ParseSess,
     return res;
 }
 
-fn strip_test_functions(diagnostic: &errors::Handler, krate: ast::Crate)
-                        -> ast::Crate {
+fn strip_test_functions(krate: ast::Crate) -> ast::Crate {
     // When not compiling with --test we should not compile the
     // #[test] functions
-    config::strip_items(diagnostic, krate, |attrs| {
-        !attr::contains_name(&attrs[..], "test") &&
-        !attr::contains_name(&attrs[..], "bench")
-    })
+    struct StripTests;
+    impl config::CfgFolder for StripTests {
+        fn configure<T: attr::HasAttrs>(&mut self, node: T) -> Option<T> {
+            let strip_node = {
+                let attrs = node.attrs();
+                attr::contains_name(attrs, "test") || attr::contains_name(attrs, "bench")
+            };
+
+            if strip_node { None } else { Some(node) }
+        }
+    }
+
+    StripTests.fold_crate(krate)
 }
 
 /// Craft a span that will be ignored by the stability lint's