about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-06-18 20:12:09 -0700
committerGitHub <noreply@github.com>2016-06-18 20:12:09 -0700
commitb1ae194fa665265cbabdfdd1d1d43fc8bb47362a (patch)
tree13530fe031f9aa00ac4a02ab4f4353b8205b73ff
parent9a681247379190896b9f56a3fb11c94ee4b83dce (diff)
parentc41cf30e9d0a5ae47e944fd8ee27eda9ce815ee1 (diff)
downloadrust-b1ae194fa665265cbabdfdd1d1d43fc8bb47362a.tar.gz
rust-b1ae194fa665265cbabdfdd1d1d43fc8bb47362a.zip
Auto merge of #34295 - jseyfried:cfg_decoration, r=eddyb
Perform `cfg` attribute processing on decorator-generated items

Fixes https://users.rust-lang.org/t/unused-attribute-warning-for-custom-derive-attribute/6180.
r? @nrc
-rw-r--r--src/libsyntax/ext/base.rs10
-rw-r--r--src/libsyntax/ext/expand.rs12
-rw-r--r--src/libsyntax/util/small_vector.rs9
3 files changed, 25 insertions, 6 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs
index 4f700e9170f..5da81a269ab 100644
--- a/src/libsyntax/ext/base.rs
+++ b/src/libsyntax/ext/base.rs
@@ -94,6 +94,16 @@ impl Annotatable {
             _ => panic!("expected Item")
         }
     }
+
+    pub fn fold_with<F: Folder>(self, folder: &mut F) -> SmallVector<Self> {
+        match self {
+            Annotatable::Item(item) => folder.fold_item(item).map(Annotatable::Item),
+            Annotatable::ImplItem(item) =>
+                folder.fold_impl_item(item.unwrap()).map(|item| Annotatable::ImplItem(P(item))),
+            Annotatable::TraitItem(item) =>
+                folder.fold_trait_item(item.unwrap()).map(|item| Annotatable::TraitItem(P(item))),
+        }
+    }
 }
 
 // A more flexible ItemDecorator.
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index ed419d94ee4..d63411568dc 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -791,8 +791,6 @@ fn decorate(a: Annotatable, fld: &mut MacroExpander) -> SmallVector<Annotatable>
     let mut decorator_items = SmallVector::zero();
     let mut new_attrs = Vec::new();
     expand_decorators(a.clone(), fld, &mut decorator_items, &mut new_attrs);
-    let decorator_items =
-        decorator_items.into_iter().flat_map(|a| expand_annotatable(a, fld)).collect();
 
     let mut new_items = SmallVector::one(a.fold_attrs(new_attrs));
     new_items.push_all(decorator_items);
@@ -845,16 +843,18 @@ fn expand_decorators(a: Annotatable,
                         }
                     });
 
-                    // we'd ideally decorator_items.push_all(expand_annotatable(ann, fld)),
-                    // but that double-mut-borrows fld
                     let mut items: SmallVector<Annotatable> = SmallVector::zero();
                     dec.expand(fld.cx,
                                attr.span,
                                &attr.node.value,
                                &a,
                                &mut |ann| items.push(ann));
-                    decorator_items.extend(items.into_iter()
-                        .flat_map(|ann| expand_annotatable(ann, fld).into_iter()));
+
+                    for item in items {
+                        for configured_item in item.fold_with(&mut fld.strip_unconfigured()) {
+                            decorator_items.extend(expand_annotatable(configured_item, fld));
+                        }
+                    }
 
                     fld.cx.bt_pop();
                 }
diff --git a/src/libsyntax/util/small_vector.rs b/src/libsyntax/util/small_vector.rs
index 9548805c1f8..893646f121f 100644
--- a/src/libsyntax/util/small_vector.rs
+++ b/src/libsyntax/util/small_vector.rs
@@ -146,6 +146,15 @@ impl<T> SmallVector<T> {
     }
 
     pub fn is_empty(&self) -> bool { self.len() == 0 }
+
+    pub fn map<U, F: FnMut(T) -> U>(self, mut f: F) -> SmallVector<U> {
+        let repr = match self.repr {
+            Zero => Zero,
+            One(t) => One(f(t)),
+            Many(vec) => Many(vec.into_iter().map(f).collect()),
+        };
+        SmallVector { repr: repr }
+    }
 }
 
 impl<T> IntoIterator for SmallVector<T> {