|
1 |
| -use crate::errors::{InvalidMetaItem, SuffixedLiteralInAttribute}; |
| 1 | +use crate::errors::{ |
| 2 | + InvalidMetaItem, InvalidMetaItemSuggQuoteIdent, InvalidMetaItemUnquotedIdent, |
| 3 | + SuffixedLiteralInAttribute, |
| 4 | +}; |
2 | 5 | use crate::fluent_generated as fluent;
|
3 | 6 |
|
4 | 7 | use super::{AttrWrapper, Capturing, FnParseMode, ForceCollect, Parser, PathStyle};
|
@@ -417,9 +420,26 @@ impl<'a> Parser<'a> {
|
417 | 420 | Err(err) => err.cancel(),
|
418 | 421 | }
|
419 | 422 |
|
420 |
| - Err(self |
421 |
| - .dcx() |
422 |
| - .create_err(InvalidMetaItem { span: self.token.span, token: self.token.clone() })) |
| 423 | + let token = self.token.clone(); |
| 424 | + |
| 425 | + // Check for unquoted idents in meta items, e.g.: #[cfg(key = foo)] |
| 426 | + // `from_expansion()` ensures we don't suggest for cases such as |
| 427 | + // `#[cfg(feature = $expr)]` in macros |
| 428 | + if self.prev_token == token::Eq && !self.token.span.from_expansion() { |
| 429 | + let before = self.token.span.shrink_to_lo(); |
| 430 | + while matches!(self.token.kind, token::Ident(..)) { |
| 431 | + self.bump(); |
| 432 | + } |
| 433 | + let after = self.prev_token.span.shrink_to_hi(); |
| 434 | + let sugg = InvalidMetaItemSuggQuoteIdent { before, after }; |
| 435 | + return Err(self.dcx().create_err(InvalidMetaItemUnquotedIdent { |
| 436 | + span: token.span, |
| 437 | + token, |
| 438 | + sugg, |
| 439 | + })); |
| 440 | + } |
| 441 | + |
| 442 | + Err(self.dcx().create_err(InvalidMetaItem { span: token.span, token })) |
423 | 443 | }
|
424 | 444 | }
|
425 | 445 |
|
|
0 commit comments