Allow literals inside meta item lists
diff --git a/src/attr.rs b/src/attr.rs
index 64bcc4e..8f70319 100644
--- a/src/attr.rs
+++ b/src/attr.rs
@@ -37,7 +37,7 @@
/// List meta item.
///
/// E.g. `derive(..)` as in `#[derive(..)]`
- List(Ident, Vec<MetaItem>),
+ List(Ident, Vec<NestedMetaItem>),
/// Name value meta item.
///
/// E.g. `feature = "foo"` as in `#[feature = "foo"]`
@@ -54,6 +54,19 @@
}
}
+/// Possible values inside of compile-time attribute lists.
+///
+/// E.g. the '..' in `#[name(..)]`.
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum NestedMetaItem {
+ /// A full MetaItem, for recursive meta items.
+ MetaItem(MetaItem),
+ /// A literal.
+ ///
+ /// E.g. "foo", 64, true
+ Literal(Lit),
+}
+
pub trait FilterAttrs<'a> {
type Ret: Iterator<Item = &'a Attribute>;
@@ -177,7 +190,7 @@
do_parse!(
id: ident >>
punct!("(") >>
- inner: terminated_list!(punct!(","), meta_item) >>
+ inner: terminated_list!(punct!(","), nested_meta_item) >>
punct!(")") >>
(MetaItem::List(id, inner))
)
@@ -191,6 +204,12 @@
|
map!(ident, MetaItem::Word)
));
+
+ named!(nested_meta_item -> NestedMetaItem, alt!(
+ meta_item => { NestedMetaItem::MetaItem }
+ |
+ lit => { NestedMetaItem::Literal }
+ ));
}
#[cfg(feature = "printing")]
@@ -258,4 +277,17 @@
}
}
}
+
+ impl ToTokens for NestedMetaItem {
+ fn to_tokens(&self, tokens: &mut Tokens) {
+ match *self {
+ NestedMetaItem::MetaItem(ref nested) => {
+ nested.to_tokens(tokens);
+ }
+ NestedMetaItem::Literal(ref lit) => {
+ lit.to_tokens(tokens);
+ }
+ }
+ }
+ }
}