Rollup merge of #126452 - compiler-errors:raw-lifetimes, r=spastorino
Implement raw lifetimes and labels (`'r#ident`) This PR does two things: 1. Reserve lifetime prefixes, e.g. `'prefix#lt` in edition 2021. 2. Implements raw lifetimes, e.g. `'r#async` in edition 2021. This PR additionally extends the `keyword_idents_2024` lint to also check lifetimes. cc `@traviscross` r? parser
This commit is contained in:
commit
ccf3f6e59d
40 changed files with 373 additions and 85 deletions
|
@ -708,6 +708,10 @@ lint_range_endpoint_out_of_range = range endpoint is out of range for `{$ty}`
|
|||
lint_range_use_inclusive_range = use an inclusive range instead
|
||||
|
||||
|
||||
lint_raw_prefix = prefix `'r` is reserved
|
||||
.label = reserved prefix
|
||||
.suggestion = insert whitespace here to avoid this being parsed as a prefix in Rust 2021
|
||||
|
||||
lint_reason_must_be_string_literal = reason must be a string literal
|
||||
|
||||
lint_reason_must_come_last = reason in lint attribute must come last
|
||||
|
|
|
@ -1851,9 +1851,16 @@ impl KeywordIdents {
|
|||
TokenTree::Token(token, _) => {
|
||||
if let Some((ident, token::IdentIsRaw::No)) = token.ident() {
|
||||
if !prev_dollar {
|
||||
self.check_ident_token(cx, UnderMacro(true), ident);
|
||||
self.check_ident_token(cx, UnderMacro(true), ident, "");
|
||||
}
|
||||
} else if *token == TokenKind::Dollar {
|
||||
} else if let Some((ident, token::IdentIsRaw::No)) = token.lifetime() {
|
||||
self.check_ident_token(
|
||||
cx,
|
||||
UnderMacro(true),
|
||||
ident.without_first_quote(),
|
||||
"'",
|
||||
);
|
||||
} else if token.kind == TokenKind::Dollar {
|
||||
prev_dollar = true;
|
||||
continue;
|
||||
}
|
||||
|
@ -1869,6 +1876,7 @@ impl KeywordIdents {
|
|||
cx: &EarlyContext<'_>,
|
||||
UnderMacro(under_macro): UnderMacro,
|
||||
ident: Ident,
|
||||
prefix: &'static str,
|
||||
) {
|
||||
let (lint, edition) = match ident.name {
|
||||
kw::Async | kw::Await | kw::Try => (KEYWORD_IDENTS_2018, Edition::Edition2018),
|
||||
|
@ -1902,7 +1910,7 @@ impl KeywordIdents {
|
|||
cx.emit_span_lint(
|
||||
lint,
|
||||
ident.span,
|
||||
BuiltinKeywordIdents { kw: ident, next: edition, suggestion: ident.span },
|
||||
BuiltinKeywordIdents { kw: ident, next: edition, suggestion: ident.span, prefix },
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1915,7 +1923,11 @@ impl EarlyLintPass for KeywordIdents {
|
|||
self.check_tokens(cx, &mac.args.tokens);
|
||||
}
|
||||
fn check_ident(&mut self, cx: &EarlyContext<'_>, ident: Ident) {
|
||||
self.check_ident_token(cx, UnderMacro(false), ident);
|
||||
if ident.name.as_str().starts_with('\'') {
|
||||
self.check_ident_token(cx, UnderMacro(false), ident.without_first_quote(), "'");
|
||||
} else {
|
||||
self.check_ident_token(cx, UnderMacro(false), ident, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -172,6 +172,10 @@ pub(super) fn decorate_lint(sess: &Session, diagnostic: BuiltinLintDiag, diag: &
|
|||
}
|
||||
.decorate_lint(diag);
|
||||
}
|
||||
BuiltinLintDiag::RawPrefix(label_span) => {
|
||||
lints::RawPrefix { label: label_span, suggestion: label_span.shrink_to_hi() }
|
||||
.decorate_lint(diag);
|
||||
}
|
||||
BuiltinLintDiag::UnusedBuiltinAttribute { attr_name, macro_name, invoc_span } => {
|
||||
lints::UnusedBuiltinAttribute { invoc_span, attr_name, macro_name }.decorate_lint(diag);
|
||||
}
|
||||
|
|
|
@ -363,8 +363,9 @@ pub(crate) enum BuiltinEllipsisInclusiveRangePatternsLint {
|
|||
pub(crate) struct BuiltinKeywordIdents {
|
||||
pub kw: Ident,
|
||||
pub next: Edition,
|
||||
#[suggestion(code = "r#{kw}", applicability = "machine-applicable")]
|
||||
#[suggestion(code = "{prefix}r#{kw}", applicability = "machine-applicable")]
|
||||
pub suggestion: Span,
|
||||
pub prefix: &'static str,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
|
@ -2814,6 +2815,15 @@ pub(crate) struct ReservedPrefix {
|
|||
pub prefix: String,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_raw_prefix)]
|
||||
pub(crate) struct RawPrefix {
|
||||
#[label]
|
||||
pub label: Span,
|
||||
#[suggestion(code = " ", applicability = "machine-applicable")]
|
||||
pub suggestion: Span,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_unused_builtin_attribute)]
|
||||
pub(crate) struct UnusedBuiltinAttribute {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue