use crate::util::parser::{self, AssocOp, Fixity};
use crate::attr;
use crate::source_map::{self, SourceMap, Spanned};
-use crate::parse::token::{self, BinOpToken, Nonterminal, Token, TokenKind};
+use crate::parse::token::{self, BinOpToken, DelimToken, Nonterminal, Token, TokenKind};
use crate::parse::lexer::comments;
use crate::parse::{self, ParseSess};
use crate::print::pp::{self, Breaks};
if let Some(mi) = attr.meta() {
self.print_meta_item(&mi);
} else {
- self.print_path(&attr.path, false, 0);
- self.space();
- self.print_tts(attr.tokens.clone(), true);
+ match attr.tokens.trees().next() {
+ Some(TokenTree::Delimited(_, delim, tts)) => {
+ let delim = match delim {
+ DelimToken::Brace => MacDelimiter::Brace,
+ DelimToken::Bracket => MacDelimiter::Bracket,
+ DelimToken::Paren | DelimToken::NoDelim => MacDelimiter::Parenthesis,
+ };
+ self.print_mac_common(&attr.path, false, None, tts, delim, attr.span);
+ }
+ tree => {
+ self.print_path(&attr.path, false, 0);
+ if tree.is_some() {
+ self.space();
+ self.print_tts(attr.tokens.clone(), true);
+ }
+ }
+ }
}
self.word("]");
}
#[proc_macro_derive(B, attributes(B, C))]
pub fn derive(input: TokenStream) -> TokenStream {
let input = input.to_string();
- assert!(input.contains("#[B [ arbitrary tokens ]]"));
+ assert!(input.contains("#[B[arbitrary tokens]]"));
assert!(input.contains("struct B {"));
assert!(input.contains("#[C]"));
"".parse().unwrap()