|
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