diff options
| author | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2017-03-18 01:55:51 +0000 |
|---|---|---|
| committer | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2017-05-25 05:51:06 +0000 |
| commit | 2a1d2edb821e123586049f349bb4aaee2d001cc6 (patch) | |
| tree | ea86b6b7403e222132be53f01949f393b31a41d7 /src/libsyntax/ext | |
| parent | 9c6430b3257a96d587349d85aa7596d3f4704c28 (diff) | |
| download | rust-2a1d2edb821e123586049f349bb4aaee2d001cc6.tar.gz rust-2a1d2edb821e123586049f349bb4aaee2d001cc6.zip | |
Declarative macros 2.0 without hygiene.
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 7ac3990def4..ad09d583734 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -162,6 +162,12 @@ pub fn compile(sess: &ParseSess, features: &RefCell<Features>, def: &ast::Item) let lhs_nm = ast::Ident::with_empty_ctxt(Symbol::gensym("lhs")); let rhs_nm = ast::Ident::with_empty_ctxt(Symbol::gensym("rhs")); + // Parse the macro_rules! invocation + let body = match def.node { + ast::ItemKind::MacroDef(ref body) => body, + _ => unreachable!(), + }; + // The pattern that macro_rules matches. // The grammar for macro_rules! is: // $( $lhs:tt => $rhs:tt );+ @@ -174,7 +180,7 @@ pub fn compile(sess: &ParseSess, features: &RefCell<Features>, def: &ast::Item) quoted::TokenTree::Token(DUMMY_SP, token::FatArrow), quoted::TokenTree::MetaVarDecl(DUMMY_SP, rhs_nm, ast::Ident::from_str("tt")), ], - separator: Some(token::Semi), + separator: Some(if body.legacy { token::Semi } else { token::Comma }), op: quoted::KleeneOp::OneOrMore, num_captures: 2, })), @@ -187,12 +193,7 @@ pub fn compile(sess: &ParseSess, features: &RefCell<Features>, def: &ast::Item) })), ]; - // Parse the macro_rules! invocation - let body = match def.node { - ast::ItemKind::MacroDef(ref body) => body.stream(), - _ => unreachable!(), - }; - let argument_map = match parse(sess, body, &argument_gram, None, true) { + let argument_map = match parse(sess, body.stream(), &argument_gram, None, true) { Success(m) => m, Failure(sp, tok) => { let s = parse_failure_msg(tok); |
