about summary refs log tree commit diff
path: root/src/libsyntax/ext
diff options
context:
space:
mode:
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-06-16 06:44:53 +0000
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-06-16 07:58:43 +0000
commitc41cf30e9d0a5ae47e944fd8ee27eda9ce815ee1 (patch)
tree68c843f906df68211f11e624a5effc5fdb57cbf2 /src/libsyntax/ext
parent83d283b67bbc668e1ab262b3f199c046567e9954 (diff)
downloadrust-c41cf30e9d0a5ae47e944fd8ee27eda9ce815ee1.tar.gz
rust-c41cf30e9d0a5ae47e944fd8ee27eda9ce815ee1.zip
Strip unconfigured nodes from decorator-generated AST
Diffstat (limited to 'src/libsyntax/ext')
-rw-r--r--src/libsyntax/ext/base.rs10
-rw-r--r--src/libsyntax/ext/expand.rs10
2 files changed, 16 insertions, 4 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs
index b5e4dc63e84..776c71822cd 100644
--- a/src/libsyntax/ext/base.rs
+++ b/src/libsyntax/ext/base.rs
@@ -95,6 +95,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 bcd97a95db3..a0ee2166429 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -839,16 +839,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();
                 }