|
1 |
| -use crate::errors::{ |
2 |
| - InvalidMetaItem, InvalidMetaItemSuggQuoteIdent, InvalidMetaItemUnquotedIdent, |
3 |
| - SuffixedLiteralInAttribute, |
4 |
| -}; |
| 1 | +use crate::errors; |
5 | 2 | use crate::fluent_generated as fluent;
|
6 | 3 | use crate::maybe_whole;
|
7 | 4 |
|
@@ -318,7 +315,7 @@ impl<'a> Parser<'a> {
|
318 | 315 | debug!("checking if {:?} is unsuffixed", lit);
|
319 | 316 |
|
320 | 317 | if !lit.kind.is_unsuffixed() {
|
321 |
| - self.dcx().emit_err(SuffixedLiteralInAttribute { span: lit.span }); |
| 318 | + self.dcx().emit_err(errors::SuffixedLiteralInAttribute { span: lit.span }); |
322 | 319 | }
|
323 | 320 |
|
324 | 321 | Ok(lit)
|
@@ -356,10 +353,11 @@ impl<'a> Parser<'a> {
|
356 | 353 | Ok(nmis)
|
357 | 354 | }
|
358 | 355 |
|
359 |
| - /// Matches the following grammar (per RFC 1559). |
| 356 | + /// Parse a meta item per RFC 1559. |
| 357 | + /// |
360 | 358 | /// ```ebnf
|
361 |
| - /// meta_item : PATH ( '=' UNSUFFIXED_LIT | '(' meta_item_inner? ')' )? ; |
362 |
| - /// meta_item_inner : (meta_item | UNSUFFIXED_LIT) (',' meta_item_inner)? ; |
| 359 | + /// MetaItem = SimplePath ( '=' UNSUFFIXED_LIT | '(' MetaSeq? ')' )? ; |
| 360 | + /// MetaSeq = MetaItemInner (',' MetaItemInner)* ','? ; |
363 | 361 | /// ```
|
364 | 362 | pub fn parse_meta_item(&mut self) -> PResult<'a, ast::MetaItem> {
|
365 | 363 | // We can't use `maybe_whole` here because it would bump in the `None`
|
@@ -387,46 +385,52 @@ impl<'a> Parser<'a> {
|
387 | 385 | Ok(if self.eat(&token::Eq) {
|
388 | 386 | ast::MetaItemKind::NameValue(self.parse_unsuffixed_meta_item_lit()?)
|
389 | 387 | } else if self.check(&token::OpenDelim(Delimiter::Parenthesis)) {
|
390 |
| - // Matches `meta_seq = ( COMMASEP(meta_item_inner) )`. |
391 | 388 | let (list, _) = self.parse_paren_comma_seq(|p| p.parse_meta_item_inner())?;
|
392 | 389 | ast::MetaItemKind::List(list)
|
393 | 390 | } else {
|
394 | 391 | ast::MetaItemKind::Word
|
395 | 392 | })
|
396 | 393 | }
|
397 | 394 |
|
398 |
| - /// Matches `meta_item_inner : (meta_item | UNSUFFIXED_LIT) ;`. |
| 395 | + /// Parse an inner meta item per RFC 1559. |
| 396 | + /// |
| 397 | + /// ```ebnf |
| 398 | + /// MetaItemInner = UNSUFFIXED_LIT | MetaItem ; |
| 399 | + /// ``` |
399 | 400 | fn parse_meta_item_inner(&mut self) -> PResult<'a, ast::NestedMetaItem> {
|
400 | 401 | match self.parse_unsuffixed_meta_item_lit() {
|
401 | 402 | Ok(lit) => return Ok(ast::NestedMetaItem::Lit(lit)),
|
402 |
| - Err(err) => err.cancel(), |
| 403 | + Err(err) => err.cancel(), // we provide a better error below |
403 | 404 | }
|
404 | 405 |
|
405 | 406 | match self.parse_meta_item() {
|
406 | 407 | Ok(mi) => return Ok(ast::NestedMetaItem::MetaItem(mi)),
|
407 |
| - Err(err) => err.cancel(), |
| 408 | + Err(err) => err.cancel(), // we provide a better error below |
408 | 409 | }
|
409 | 410 |
|
410 |
| - let token = self.token.clone(); |
| 411 | + let mut err = errors::InvalidMetaItem { |
| 412 | + span: self.token.span, |
| 413 | + token: self.token.clone(), |
| 414 | + quote_ident_sugg: None, |
| 415 | + }; |
411 | 416 |
|
412 |
| - // Check for unquoted idents in meta items, e.g.: #[cfg(key = foo)] |
413 |
| - // `from_expansion()` ensures we don't suggest for cases such as |
414 |
| - // `#[cfg(feature = $expr)]` in macros |
415 |
| - if self.prev_token == token::Eq && !self.token.span.from_expansion() { |
| 417 | + // Suggest quoting idents, e.g. in `#[cfg(key = value)]`. We don't use `Token::ident` and |
| 418 | + // don't `uninterpolate` the token to avoid suggesting anything butchered or questionable |
| 419 | + // when macro metavariables are involved. |
| 420 | + if self.prev_token == token::Eq |
| 421 | + && let token::Ident(..) = self.token.kind |
| 422 | + { |
416 | 423 | let before = self.token.span.shrink_to_lo();
|
417 |
| - while matches!(self.token.kind, token::Ident(..)) { |
| 424 | + while let token::Ident(..) = self.token.kind { |
418 | 425 | self.bump();
|
419 | 426 | }
|
420 |
| - let after = self.prev_token.span.shrink_to_hi(); |
421 |
| - let sugg = InvalidMetaItemSuggQuoteIdent { before, after }; |
422 |
| - return Err(self.dcx().create_err(InvalidMetaItemUnquotedIdent { |
423 |
| - span: token.span, |
424 |
| - token, |
425 |
| - sugg, |
426 |
| - })); |
| 427 | + err.quote_ident_sugg = Some(errors::InvalidMetaItemQuoteIdentSugg { |
| 428 | + before, |
| 429 | + after: self.prev_token.span.shrink_to_hi(), |
| 430 | + }); |
427 | 431 | }
|
428 | 432 |
|
429 |
| - Err(self.dcx().create_err(InvalidMetaItem { span: token.span, token })) |
| 433 | + Err(self.dcx().create_err(err)) |
430 | 434 | }
|
431 | 435 | }
|
432 | 436 |
|
|
0 commit comments