fixup! Reinstated name in MetaItem since it's no longer trivial to get it from its parent.
diff --git a/src/attr.rs b/src/attr.rs
index 0edace9..82bc02a 100644
--- a/src/attr.rs
+++ b/src/attr.rs
@@ -25,8 +25,14 @@
impl Attribute {
/// Parses the tokens after the path as a [`MetaItem`](enum.MetaItem.html) if possible.
pub fn meta_item(&self) -> Option<MetaItem> {
+ let name = if self.path.segments.len() == 1 {
+ &self.path.segments[0].ident
+ } else {
+ return None;
+ };
+
if self.tts.is_empty() {
- return Some(MetaItem::Word);
+ return Some(MetaItem::Word(name.clone()));
}
if self.tts.len() == 1 {
@@ -43,7 +49,7 @@
if tts.len() >= 3 {
match (&tts[1], &tts[2]) {
(&TokenTree::Token(Token::Eq), &TokenTree::Token(Token::Literal(ref lit))) => {
- return Some((NestedMetaItem::MetaItem(ident.clone(), MetaItem::NameValue(lit.clone())), &tts[3..]));
+ return Some((NestedMetaItem::MetaItem(MetaItem::NameValue(ident.clone(), lit.clone())), &tts[3..]));
}
_ => {}
@@ -54,7 +60,7 @@
if let TokenTree::Delimited(Delimited { delim: DelimToken::Paren, tts: ref inner_tts }) = tts[1] {
return match list_of_nested_meta_items_from_tokens(vec![], inner_tts) {
Some(nested_meta_items) => {
- Some((NestedMetaItem::MetaItem(ident.clone(), MetaItem::List(nested_meta_items)), &tts[2..]))
+ Some((NestedMetaItem::MetaItem(MetaItem::List(ident.clone(), nested_meta_items)), &tts[2..]))
}
None => None
@@ -62,7 +68,7 @@
}
}
- Some((NestedMetaItem::MetaItem(ident.clone(), MetaItem::Word), &tts[1..]))
+ Some((NestedMetaItem::MetaItem(MetaItem::Word(ident.clone())), &tts[1..]))
}
_ => None
@@ -93,7 +99,7 @@
}
if let Some(nested_meta_items) = list_of_nested_meta_items_from_tokens(vec![], tts) {
- return Some(MetaItem::List(nested_meta_items));
+ return Some(MetaItem::List(name.clone(), nested_meta_items));
}
}
}
@@ -101,7 +107,7 @@
if self.tts.len() == 2 {
match (&self.tts[0], &self.tts[1]) {
(&TokenTree::Token(Token::Eq), &TokenTree::Token(Token::Literal(ref lit))) => {
- return Some(MetaItem::NameValue(lit.clone()));
+ return Some(MetaItem::NameValue(name.clone(), lit.clone()));
}
_ => {}
@@ -132,17 +138,31 @@
/// Word meta item.
///
/// E.g. `test` as in `#[test]`
- Word,
+ Word(Ident),
/// List meta item.
///
/// E.g. `derive(..)` as in `#[derive(..)]`
- List(Vec<NestedMetaItem>),
+ List(Ident, Vec<NestedMetaItem>),
/// Name-value meta item.
///
/// E.g. `feature = "foo"` as in `#[feature = "foo"]`
- NameValue(Lit),
+ NameValue(Ident, Lit),
+}
+
+impl MetaItem {
+ /// Name of the item.
+ ///
+ /// E.g. `test` as in `#[test]`, `derive` as in `#[derive(..)]`, and
+ /// `feature` as in `#[feature = "foo"]`.
+ pub fn name(&self) -> &str {
+ match *self {
+ MetaItem::Word(ref name) |
+ MetaItem::List(ref name, _) |
+ MetaItem::NameValue(ref name, _) => name.as_ref(),
+ }
+ }
}
/// Possible values inside of compile-time attribute lists.
@@ -152,8 +172,8 @@
pub enum NestedMetaItem {
/// A full `MetaItem`.
///
- /// E.g. `Copy` in `#[derive(Copy)]` would be a `(Ident::from("Copy"), MetaItem::Word)`.
- MetaItem(Ident, MetaItem),
+ /// E.g. `Copy` in `#[derive(Copy)]` would be a `MetaItem::Word(Ident::from("Copy"))`.
+ MetaItem(MetaItem),
/// A Rust literal.
///
@@ -369,13 +389,17 @@
impl ToTokens for MetaItem {
fn to_tokens(&self, tokens: &mut Tokens) {
match *self {
- MetaItem::Word => {}
- MetaItem::List(ref inner) => {
+ MetaItem::Word(ref ident) => {
+ ident.to_tokens(tokens);
+ }
+ MetaItem::List(ref ident, ref inner) => {
+ ident.to_tokens(tokens);
tokens.append("(");
tokens.append_separated(inner, ",");
tokens.append(")");
}
- MetaItem::NameValue(ref value) => {
+ MetaItem::NameValue(ref name, ref value) => {
+ name.to_tokens(tokens);
tokens.append("=");
value.to_tokens(tokens);
}
@@ -386,8 +410,7 @@
impl ToTokens for NestedMetaItem {
fn to_tokens(&self, tokens: &mut Tokens) {
match *self {
- NestedMetaItem::MetaItem(ref ident, ref nested) => {
- ident.to_tokens(tokens);
+ NestedMetaItem::MetaItem(ref nested) => {
nested.to_tokens(tokens);
}
NestedMetaItem::Literal(ref lit) => {