diff options
| author | bors <bors@rust-lang.org> | 2016-06-18 20:12:09 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-06-18 20:12:09 -0700 |
| commit | b1ae194fa665265cbabdfdd1d1d43fc8bb47362a (patch) | |
| tree | 13530fe031f9aa00ac4a02ab4f4353b8205b73ff | |
| parent | 9a681247379190896b9f56a3fb11c94ee4b83dce (diff) | |
| parent | c41cf30e9d0a5ae47e944fd8ee27eda9ce815ee1 (diff) | |
| download | rust-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.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 12 | ||||
| -rw-r--r-- | src/libsyntax/util/small_vector.rs | 9 |
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> { |
