Address review comments

This commit is contained in:
Vadim Petrochenkov 2019-12-02 21:56:11 +03:00
parent cf71538094
commit 498737c8e9
3 changed files with 17 additions and 10 deletions

View file

@ -277,6 +277,8 @@ pub fn parse_in_attr<'a, T>(
) -> PResult<'a, T> {
let mut parser = Parser::new(
sess,
// FIXME(#66940, Centril | petrochenkov): refactor this function so it doesn't
// require reconstructing and immediately re-parsing delimiters.
attr.get_normal_item().args.outer_tokens(),
None,
false,

View file

@ -1024,7 +1024,8 @@ impl<'a> Parser<'a> {
self.check(&token::OpenDelim(DelimToken::Brace)) {
match self.parse_token_tree() {
TokenTree::Delimited(dspan, delim, tokens) =>
MacArgs::Delimited(dspan, MacDelimiter::from_token(delim), tokens),
// We've confirmed above that there is a delimiter so unwrapping is OK.
MacArgs::Delimited(dspan, MacDelimiter::from_token(delim).unwrap(), tokens),
_ => unreachable!(),
}
} else if !delimited_only {

View file

@ -1396,8 +1396,12 @@ pub enum MacArgs {
/// Delimited arguments - `#[attr()/[]/{}]` or `mac!()/[]/{}`.
Delimited(DelimSpan, MacDelimiter, TokenStream),
/// Arguments of a key-value attribute - `#[attr = "value"]`.
/// Span belongs to the `=` token, token stream is the "value".
Eq(Span, TokenStream),
Eq(
/// Span of the `=` token.
Span,
/// Token stream of the "value".
TokenStream,
),
}
impl MacArgs {
@ -1421,13 +1425,13 @@ impl MacArgs {
pub fn inner_tokens(&self) -> TokenStream {
match self {
MacArgs::Empty => TokenStream::default(),
MacArgs::Delimited(.., tokens) => tokens.clone(),
MacArgs::Delimited(.., tokens) |
MacArgs::Eq(.., tokens) => tokens.clone(),
}
}
/// Tokens together with the delimiters or `=`.
/// Use of this functions generally means that something suboptimal or hacky is happening.
/// Use of this method generally means that something suboptimal or hacky is happening.
pub fn outer_tokens(&self) -> TokenStream {
match *self {
MacArgs::Empty => TokenStream::default(),
@ -1461,12 +1465,12 @@ impl MacDelimiter {
}
}
pub fn from_token(delim: DelimToken) -> MacDelimiter {
pub fn from_token(delim: DelimToken) -> Option<MacDelimiter> {
match delim {
token::Paren => MacDelimiter::Parenthesis,
token::Bracket => MacDelimiter::Bracket,
token::Brace => MacDelimiter::Brace,
token::NoDelim => panic!("expected a delimiter"),
token::Paren => Some(MacDelimiter::Parenthesis),
token::Bracket => Some(MacDelimiter::Bracket),
token::Brace => Some(MacDelimiter::Brace),
token::NoDelim => None,
}
}
}