1
Fork 0

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> { ) -> PResult<'a, T> {
let mut parser = Parser::new( let mut parser = Parser::new(
sess, 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(), attr.get_normal_item().args.outer_tokens(),
None, None,
false, false,

View file

@ -1024,7 +1024,8 @@ impl<'a> Parser<'a> {
self.check(&token::OpenDelim(DelimToken::Brace)) { self.check(&token::OpenDelim(DelimToken::Brace)) {
match self.parse_token_tree() { match self.parse_token_tree() {
TokenTree::Delimited(dspan, delim, tokens) => 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!(), _ => unreachable!(),
} }
} else if !delimited_only { } else if !delimited_only {

View file

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