diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2014-03-26 16:14:07 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2014-03-28 16:37:45 -0700 |
| commit | c6bbb95ce26e75214003190b643f5098e39b6428 (patch) | |
| tree | ddeebe963d1c6ded3112ddbb6625ed02eb28e884 /src/libsyntax/parse | |
| parent | cbfc0a5e33eb3d97a2995d120536b8dadc0cc0a2 (diff) | |
| download | rust-c6bbb95ce26e75214003190b643f5098e39b6428.tar.gz rust-c6bbb95ce26e75214003190b643f5098e39b6428.zip | |
syntax: Accept meta matchers in macros
This removes the `attr` matcher and adds a `meta` matcher. The previous `attr` matcher is now ambiguous because it doesn't disambiguate whether it means inner attribute or outer attribute. The new behavior can still be achieved by taking an argument of the form `#[$foo:meta]` (the brackets are part of the macro pattern). Closes #13067
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/attr.rs | 19 | ||||
| -rw-r--r-- | src/libsyntax/parse/token.rs | 8 |
2 files changed, 12 insertions, 15 deletions
diff --git a/src/libsyntax/parse/attr.rs b/src/libsyntax/parse/attr.rs index 8f7fb5749a1..b569bb28a7d 100644 --- a/src/libsyntax/parse/attr.rs +++ b/src/libsyntax/parse/attr.rs @@ -34,9 +34,6 @@ impl<'a> ParserAttr for Parser<'a> { debug!("parse_outer_attributes: self.token={:?}", self.token); match self.token { - token::INTERPOLATED(token::NtAttr(..)) => { - attrs.push(self.parse_attribute(false)); - } token::POUND => { attrs.push(self.parse_attribute(false)); } @@ -66,11 +63,6 @@ impl<'a> ParserAttr for Parser<'a> { debug!("parse_attributes: permit_inner={:?} self.token={:?}", permit_inner, self.token); let (span, value, mut style) = match self.token { - INTERPOLATED(token::NtAttr(attr)) => { - assert!(attr.node.style == ast::AttrOuter); - self.bump(); - (attr.span, attr.node.value, ast::AttrOuter) - } token::POUND => { let lo = self.span.lo; self.bump(); @@ -133,9 +125,6 @@ impl<'a> ParserAttr for Parser<'a> { let mut next_outer_attrs: Vec<ast::Attribute> = Vec::new(); loop { let attr = match self.token { - token::INTERPOLATED(token::NtAttr(..)) => { - self.parse_attribute(true) - } token::POUND => { self.parse_attribute(true) } @@ -163,6 +152,14 @@ impl<'a> ParserAttr for Parser<'a> { // | IDENT = lit // | IDENT meta_seq fn parse_meta_item(&mut self) -> @ast::MetaItem { + match self.token { + token::INTERPOLATED(token::NtMeta(e)) => { + self.bump(); + return e + } + _ => {} + } + let lo = self.span.lo; let ident = self.parse_ident(); let name = self.id_to_interned_str(ident); diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 7bb920bdf56..e3eb1f1f711 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -113,7 +113,7 @@ pub enum Nonterminal { NtExpr(@ast::Expr), NtTy( P<ast::Ty>), NtIdent(~ast::Ident, bool), - NtAttr(@ast::Attribute), // #[foo] + NtMeta(@ast::MetaItem), // stuff inside brackets for attributes NtPath(~ast::Path), NtTT( @ast::TokenTree), // needs @ed to break a circularity NtMatchers(Vec<ast::Matcher> ) @@ -129,7 +129,7 @@ impl fmt::Show for Nonterminal { NtExpr(..) => f.pad("NtExpr(..)"), NtTy(..) => f.pad("NtTy(..)"), NtIdent(..) => f.pad("NtIdent(..)"), - NtAttr(..) => f.pad("NtAttr(..)"), + NtMeta(..) => f.pad("NtMeta(..)"), NtPath(..) => f.pad("NtPath(..)"), NtTT(..) => f.pad("NtTT(..)"), NtMatchers(..) => f.pad("NtMatchers(..)"), @@ -241,7 +241,7 @@ pub fn to_str(t: &Token) -> ~str { INTERPOLATED(ref nt) => { match nt { &NtExpr(e) => ::print::pprust::expr_to_str(e), - &NtAttr(e) => ::print::pprust::attribute_to_str(e), + &NtMeta(e) => ::print::pprust::meta_item_to_str(e), _ => { ~"an interpolated " + match *nt { @@ -249,7 +249,7 @@ pub fn to_str(t: &Token) -> ~str { NtBlock(..) => ~"block", NtStmt(..) => ~"statement", NtPat(..) => ~"pattern", - NtAttr(..) => fail!("should have been handled"), + NtMeta(..) => fail!("should have been handled"), NtExpr(..) => fail!("should have been handled above"), NtTy(..) => ~"type", NtIdent(..) => ~"identifier", |
