}
}
-// A more flexible ItemKind::Modifier (ItemKind::Modifier should go away, eventually, FIXME).
-// meta_item is the annotation, item is the item being modified, parent_item
-// is the impl or trait item is declared in if item is part of such a thing.
+// `meta_item` is the annotation, and `item` is the item being modified.
// FIXME Decorators should follow the same pattern too.
pub trait MultiItemModifier {
fn expand(&self,
span: Span,
meta_item: &ast::MetaItem,
item: Annotatable)
- -> Annotatable;
+ -> Vec<Annotatable>;
}
-impl<F> MultiItemModifier for F
- where F: Fn(&mut ExtCtxt,
- Span,
- &ast::MetaItem,
- Annotatable) -> Annotatable
+impl<F, T> MultiItemModifier for F
+ where F: Fn(&mut ExtCtxt, Span, &ast::MetaItem, Annotatable) -> T,
+ T: Into<Vec<Annotatable>>,
{
fn expand(&self,
ecx: &mut ExtCtxt,
span: Span,
meta_item: &ast::MetaItem,
item: Annotatable)
- -> Annotatable {
- (*self)(ecx, span, meta_item, item)
+ -> Vec<Annotatable> {
+ (*self)(ecx, span, meta_item, item).into()
+ }
+}
+
+impl Into<Vec<Annotatable>> for Annotatable {
+ fn into(self) -> Vec<Annotatable> {
+ vec![self]
}
}
});
let modified = mac.expand(fld.cx, attr.span, &attr.node.value, item);
fld.cx.bt_pop();
- expand_annotatable(modified, fld)
+ modified.into_iter().flat_map(|it| expand_annotatable(it, fld)).collect()
}
_ => unreachable!(),
}