Auto merge of #119341 - sjwang05:issue-58462, r=WaffleLapkin
Suggest quoting unquoted idents in attrs Closes #58462
This commit is contained in:
commit
aa5f781bd4
@ -407,6 +407,9 @@ parse_invalid_logical_operator = `{$incorrect}` is not a logical operator
|
|||||||
|
|
||||||
parse_invalid_meta_item = expected unsuffixed literal or identifier, found `{$token}`
|
parse_invalid_meta_item = expected unsuffixed literal or identifier, found `{$token}`
|
||||||
|
|
||||||
|
parse_invalid_meta_item_unquoted_ident = expected unsuffixed literal, found `{$token}`
|
||||||
|
.suggestion = surround the identifier with quotation marks to parse it as a string
|
||||||
|
|
||||||
parse_invalid_offset_of = offset_of expects dot-separated field and variant names
|
parse_invalid_offset_of = offset_of expects dot-separated field and variant names
|
||||||
|
|
||||||
parse_invalid_unicode_escape = invalid unicode character escape
|
parse_invalid_unicode_escape = invalid unicode character escape
|
||||||
|
@ -973,6 +973,25 @@ pub(crate) struct InvalidMetaItem {
|
|||||||
pub token: Token,
|
pub token: Token,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(parse_invalid_meta_item_unquoted_ident)]
|
||||||
|
pub(crate) struct InvalidMetaItemUnquotedIdent {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
pub token: Token,
|
||||||
|
#[subdiagnostic]
|
||||||
|
pub sugg: InvalidMetaItemSuggQuoteIdent,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
|
||||||
|
pub(crate) struct InvalidMetaItemSuggQuoteIdent {
|
||||||
|
#[suggestion_part(code = "\"")]
|
||||||
|
pub before: Span,
|
||||||
|
#[suggestion_part(code = "\"")]
|
||||||
|
pub after: Span,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Subdiagnostic)]
|
#[derive(Subdiagnostic)]
|
||||||
#[suggestion(
|
#[suggestion(
|
||||||
parse_sugg_escape_identifier,
|
parse_sugg_escape_identifier,
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
use crate::errors::{InvalidMetaItem, SuffixedLiteralInAttribute};
|
use crate::errors::{
|
||||||
|
InvalidMetaItem, InvalidMetaItemSuggQuoteIdent, InvalidMetaItemUnquotedIdent,
|
||||||
|
SuffixedLiteralInAttribute,
|
||||||
|
};
|
||||||
use crate::fluent_generated as fluent;
|
use crate::fluent_generated as fluent;
|
||||||
|
|
||||||
use super::{AttrWrapper, Capturing, FnParseMode, ForceCollect, Parser, PathStyle};
|
use super::{AttrWrapper, Capturing, FnParseMode, ForceCollect, Parser, PathStyle};
|
||||||
@ -417,9 +420,26 @@ impl<'a> Parser<'a> {
|
|||||||
Err(err) => err.cancel(),
|
Err(err) => err.cancel(),
|
||||||
}
|
}
|
||||||
|
|
||||||
Err(self
|
let token = self.token.clone();
|
||||||
.dcx()
|
|
||||||
.create_err(InvalidMetaItem { span: self.token.span, token: self.token.clone() }))
|
// Check for unquoted idents in meta items, e.g.: #[cfg(key = foo)]
|
||||||
|
// `from_expansion()` ensures we don't suggest for cases such as
|
||||||
|
// `#[cfg(feature = $expr)]` in macros
|
||||||
|
if self.prev_token == token::Eq && !self.token.span.from_expansion() {
|
||||||
|
let before = self.token.span.shrink_to_lo();
|
||||||
|
while matches!(self.token.kind, token::Ident(..)) {
|
||||||
|
self.bump();
|
||||||
|
}
|
||||||
|
let after = self.prev_token.span.shrink_to_hi();
|
||||||
|
let sugg = InvalidMetaItemSuggQuoteIdent { before, after };
|
||||||
|
return Err(self.dcx().create_err(InvalidMetaItemUnquotedIdent {
|
||||||
|
span: token.span,
|
||||||
|
token,
|
||||||
|
sugg,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(self.dcx().create_err(InvalidMetaItem { span: token.span, token }))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,5 +7,5 @@ fn main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[deprecated(note = test)]
|
#[deprecated(note = test)]
|
||||||
//~^ ERROR expected unsuffixed literal or identifier, found `test`
|
//~^ ERROR expected unsuffixed literal, found `test`
|
||||||
fn foo() {}
|
fn foo() {}
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
error: expected unsuffixed literal or identifier, found `test`
|
error: expected unsuffixed literal, found `test`
|
||||||
--> $DIR/issue-66340-deprecated-attr-non-meta-grammar.rs:9:21
|
--> $DIR/issue-66340-deprecated-attr-non-meta-grammar.rs:9:21
|
||||||
|
|
|
|
||||||
LL | #[deprecated(note = test)]
|
LL | #[deprecated(note = test)]
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: surround the identifier with quotation marks to parse it as a string
|
||||||
|
|
|
||||||
|
LL | #[deprecated(note = "test")]
|
||||||
|
| + +
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
15
tests/ui/parser/attribute/attr-unquoted-ident.fixed
Normal file
15
tests/ui/parser/attribute/attr-unquoted-ident.fixed
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// compile-flags: -Zdeduplicate-diagnostics=yes
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
#[cfg(key="foo")]
|
||||||
|
//~^ ERROR expected unsuffixed literal, found `foo`
|
||||||
|
//~| HELP surround the identifier with quotation marks to parse it as a string
|
||||||
|
println!();
|
||||||
|
#[cfg(key="bar")]
|
||||||
|
println!();
|
||||||
|
#[cfg(key="foo bar baz")]
|
||||||
|
//~^ ERROR expected unsuffixed literal, found `foo`
|
||||||
|
//~| HELP surround the identifier with quotation marks to parse it as a string
|
||||||
|
println!();
|
||||||
|
}
|
15
tests/ui/parser/attribute/attr-unquoted-ident.rs
Normal file
15
tests/ui/parser/attribute/attr-unquoted-ident.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// compile-flags: -Zdeduplicate-diagnostics=yes
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
#[cfg(key=foo)]
|
||||||
|
//~^ ERROR expected unsuffixed literal, found `foo`
|
||||||
|
//~| HELP surround the identifier with quotation marks to parse it as a string
|
||||||
|
println!();
|
||||||
|
#[cfg(key="bar")]
|
||||||
|
println!();
|
||||||
|
#[cfg(key=foo bar baz)]
|
||||||
|
//~^ ERROR expected unsuffixed literal, found `foo`
|
||||||
|
//~| HELP surround the identifier with quotation marks to parse it as a string
|
||||||
|
println!();
|
||||||
|
}
|
24
tests/ui/parser/attribute/attr-unquoted-ident.stderr
Normal file
24
tests/ui/parser/attribute/attr-unquoted-ident.stderr
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
error: expected unsuffixed literal, found `foo`
|
||||||
|
--> $DIR/attr-unquoted-ident.rs:5:15
|
||||||
|
|
|
||||||
|
LL | #[cfg(key=foo)]
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
help: surround the identifier with quotation marks to parse it as a string
|
||||||
|
|
|
||||||
|
LL | #[cfg(key="foo")]
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: expected unsuffixed literal, found `foo`
|
||||||
|
--> $DIR/attr-unquoted-ident.rs:11:15
|
||||||
|
|
|
||||||
|
LL | #[cfg(key=foo bar baz)]
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
help: surround the identifier with quotation marks to parse it as a string
|
||||||
|
|
|
||||||
|
LL | #[cfg(key="foo bar baz")]
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user