about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLuqman Aden <me@luqman.ca>2013-03-15 20:33:41 -0700
committerLuqman Aden <me@luqman.ca>2013-03-19 13:00:51 -0700
commit429fed0c8b776de73937a39afc60a0ec93186c1c (patch)
treef308472461855556af9a31d61f1613505ffe3e50
parenta14ec73cd2d15a2454113011835557ccf447f14d (diff)
librustc: adjust logic for cfg attribute and add not predicate.
-rw-r--r--src/librustc/front/config.rs25
1 files changed, 13 insertions, 12 deletions
diff --git a/src/librustc/front/config.rs b/src/librustc/front/config.rs
index bb0080ba535..39a1fda2c92 100644
--- a/src/librustc/front/config.rs
+++ b/src/librustc/front/config.rs
@@ -185,18 +185,19 @@ pub fn metas_in_cfg(cfg: ast::crate_cfg,
     // Pull the inner meta_items from the #[cfg(meta_item, ...)]  attributes,
     // so we can match against them. This is the list of configurations for
     // which the item is valid
-    let cfg_metas =
-        vec::concat(
-            vec::filter_map(cfg_metas, |i| attr::get_meta_item_list(i)));
-
-    let has_cfg_metas = vec::len(cfg_metas) > 0u;
-    if !has_cfg_metas { return true; }
-
-    for cfg_metas.each |cfg_mi| {
-        if attr::contains(cfg, *cfg_mi) { return true; }
-    }
-
-    return false;
+    let cfg_metas = vec::filter_map(cfg_metas, |i| attr::get_meta_item_list(i));
+
+    if cfg_metas.all(|c| c.is_empty()) { return true; }
+
+    cfg_metas.any(|cfg_meta| {
+        cfg_meta.all(|cfg_mi| {
+            match cfg_mi.node {
+                ast::meta_list(s, ref it) if *s == ~"not"
+                    => it.all(|mi| !attr::contains(cfg, *mi)),
+                _ => attr::contains(cfg, *cfg_mi)
+            }
+        })
+    })
 }