diff options
| author | Mark-Simulacrum <mark.simulacrum@gmail.com> | 2016-11-10 17:30:01 -0700 |
|---|---|---|
| committer | Mark-Simulacrum <mark.simulacrum@gmail.com> | 2016-11-12 06:42:40 -0700 |
| commit | 27c09864bd04bc3f65e8ce5721eaa5621ee9ac6a (patch) | |
| tree | 796efdc77fd3f8b11f44a9c921b79bb73f77e977 /src/libsyntax/ext/tt | |
| parent | 68abb24e8d99f0fb7175c2102da3638814b6b2c7 (diff) | |
| download | rust-27c09864bd04bc3f65e8ce5721eaa5621ee9ac6a.tar.gz rust-27c09864bd04bc3f65e8ce5721eaa5621ee9ac6a.zip | |
Refactor parse_nt.
Diffstat (limited to 'src/libsyntax/ext/tt')
| -rw-r--r-- | src/libsyntax/ext/tt/macro_parser.rs | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/libsyntax/ext/tt/macro_parser.rs b/src/libsyntax/ext/tt/macro_parser.rs index 29e1ea1d1ed..64acce19c1c 100644 --- a/src/libsyntax/ext/tt/macro_parser.rs +++ b/src/libsyntax/ext/tt/macro_parser.rs @@ -479,14 +479,19 @@ pub fn parse_nt<'a>(p: &mut Parser<'a>, sp: Span, name: &str) -> Nonterminal { p.quote_depth += 1; //but in theory, non-quoted tts might be useful let mut tt = panictry!(p.parse_token_tree()); p.quote_depth -= 1; - loop { - let nt = match tt { - TokenTree::Token(_, token::Interpolated(ref nt)) => nt.clone(), - _ => break, - }; - match *nt { - token::NtTT(ref sub_tt) => tt = sub_tt.clone(), - _ => break, + while let TokenTree::Token(sp, token::Interpolated(nt)) = tt { + if let token::NtTT(..) = *nt { + match Rc::try_unwrap(nt) { + Ok(token::NtTT(sub_tt)) => tt = sub_tt, + Ok(_) => unreachable!(), + Err(nt_rc) => match *nt_rc { + token::NtTT(ref sub_tt) => tt = sub_tt.clone(), + _ => unreachable!(), + }, + } + } else { + tt = TokenTree::Token(sp, token::Interpolated(nt.clone())); + break } } return token::NtTT(tt); |
