|
1 | 1 | use crate::errors::{InvalidMetaItem, SuffixedLiteralInAttribute};
|
2 | 2 | use crate::fluent_generated as fluent;
|
| 3 | +use crate::maybe_reparse_metavar_seq; |
3 | 4 |
|
4 |
| -use super::{AttrWrapper, Capturing, FnParseMode, ForceCollect, Parser, PathStyle}; |
| 5 | +use super::{AttrWrapper, Capturing, FnParseMode, ForceCollect, ParseNtResult, Parser, PathStyle}; |
5 | 6 | use rustc_ast as ast;
|
6 | 7 | use rustc_ast::attr;
|
7 |
| -use rustc_ast::token::{self, Delimiter, Nonterminal}; |
| 8 | +use rustc_ast::token::{self, Delimiter, NonterminalKind}; |
8 | 9 | use rustc_errors::{error_code, Diagnostic, IntoDiagnostic, PResult};
|
9 | 10 | use rustc_span::{sym, BytePos, Span};
|
10 | 11 | use std::convert::TryInto;
|
@@ -248,25 +249,23 @@ impl<'a> Parser<'a> {
|
248 | 249 | /// PATH `=` UNSUFFIXED_LIT
|
249 | 250 | /// The delimiters or `=` are still put into the resulting token stream.
|
250 | 251 | pub fn parse_attr_item(&mut self, capture_tokens: bool) -> PResult<'a, ast::AttrItem> {
|
251 |
| - let item = match &self.token.kind { |
252 |
| - token::Interpolated(nt) => match &**nt { |
253 |
| - Nonterminal::NtMeta(item) => Some(item.clone().into_inner()), |
254 |
| - _ => None, |
255 |
| - }, |
256 |
| - _ => None, |
257 |
| - }; |
258 |
| - Ok(if let Some(item) = item { |
259 |
| - self.bump(); |
| 252 | + if let Some(item) = maybe_reparse_metavar_seq!( |
| 253 | + self, |
| 254 | + NonterminalKind::Meta, |
| 255 | + NonterminalKind::Meta, |
| 256 | + ParseNtResult::Meta(item), |
260 | 257 | item
|
261 |
| - } else { |
262 |
| - let do_parse = |this: &mut Self| { |
263 |
| - let path = this.parse_path(PathStyle::Mod)?; |
264 |
| - let args = this.parse_attr_args()?; |
265 |
| - Ok(ast::AttrItem { path, args, tokens: None }) |
266 |
| - }; |
267 |
| - // Attr items don't have attributes |
268 |
| - if capture_tokens { self.collect_tokens_no_attrs(do_parse) } else { do_parse(self) }? |
269 |
| - }) |
| 258 | + ) { |
| 259 | + return Ok(item.into_inner()); |
| 260 | + } |
| 261 | + |
| 262 | + let do_parse = |this: &mut Self| { |
| 263 | + let path = this.parse_path(PathStyle::Mod)?; |
| 264 | + let args = this.parse_attr_args()?; |
| 265 | + Ok(ast::AttrItem { path, args, tokens: None }) |
| 266 | + }; |
| 267 | + // Attr items don't have attributes |
| 268 | + if capture_tokens { self.collect_tokens_no_attrs(do_parse) } else { do_parse(self) } |
270 | 269 | }
|
271 | 270 |
|
272 | 271 | /// Parses attributes that appear after the opening of an item. These should
|
@@ -368,20 +367,15 @@ impl<'a> Parser<'a> {
|
368 | 367 | /// meta_item_inner : (meta_item | UNSUFFIXED_LIT) (',' meta_item_inner)? ;
|
369 | 368 | /// ```
|
370 | 369 | pub fn parse_meta_item(&mut self) -> PResult<'a, ast::MetaItem> {
|
371 |
| - let nt_meta = match &self.token.kind { |
372 |
| - token::Interpolated(nt) => match &**nt { |
373 |
| - token::NtMeta(e) => Some(e.clone()), |
374 |
| - _ => None, |
375 |
| - }, |
376 |
| - _ => None, |
377 |
| - }; |
378 |
| - |
379 |
| - if let Some(item) = nt_meta { |
| 370 | + if let Some(item) = maybe_reparse_metavar_seq!( |
| 371 | + self, |
| 372 | + NonterminalKind::Meta, |
| 373 | + NonterminalKind::Meta, |
| 374 | + ParseNtResult::Meta(item), |
| 375 | + item |
| 376 | + ) { |
380 | 377 | return match item.meta(item.path.span) {
|
381 |
| - Some(meta) => { |
382 |
| - self.bump(); |
383 |
| - Ok(meta) |
384 |
| - } |
| 378 | + Some(meta) => Ok(meta), |
385 | 379 | None => self.unexpected(),
|
386 | 380 | };
|
387 | 381 | }
|
|
0 commit comments