Skip to content

Commit 27c0986

Browse files
Refactor parse_nt.
1 parent 68abb24 commit 27c0986

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

src/libsyntax/ext/tt/macro_parser.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -479,14 +479,19 @@ pub fn parse_nt<'a>(p: &mut Parser<'a>, sp: Span, name: &str) -> Nonterminal {
479479
p.quote_depth += 1; //but in theory, non-quoted tts might be useful
480480
let mut tt = panictry!(p.parse_token_tree());
481481
p.quote_depth -= 1;
482-
loop {
483-
let nt = match tt {
484-
TokenTree::Token(_, token::Interpolated(ref nt)) => nt.clone(),
485-
_ => break,
486-
};
487-
match *nt {
488-
token::NtTT(ref sub_tt) => tt = sub_tt.clone(),
489-
_ => break,
482+
while let TokenTree::Token(sp, token::Interpolated(nt)) = tt {
483+
if let token::NtTT(..) = *nt {
484+
match Rc::try_unwrap(nt) {
485+
Ok(token::NtTT(sub_tt)) => tt = sub_tt,
486+
Ok(_) => unreachable!(),
487+
Err(nt_rc) => match *nt_rc {
488+
token::NtTT(ref sub_tt) => tt = sub_tt.clone(),
489+
_ => unreachable!(),
490+
},
491+
}
492+
} else {
493+
tt = TokenTree::Token(sp, token::Interpolated(nt.clone()));
494+
break
490495
}
491496
}
492497
return token::NtTT(tt);

0 commit comments

Comments
 (0)