1
Fork 0

Suggest typo fix for static lifetime

This commit is contained in:
Michael Goulet 2025-03-06 17:32:32 +00:00
parent 30f168ef81
commit ac40ea7129
3 changed files with 63 additions and 18 deletions

View file

@ -24,7 +24,7 @@ use rustc_hir::def_id::{CRATE_DEF_ID, DefId};
use rustc_hir::{MissingLifetimeKind, PrimTy}; use rustc_hir::{MissingLifetimeKind, PrimTy};
use rustc_middle::ty; use rustc_middle::ty;
use rustc_session::{Session, lint}; use rustc_session::{Session, lint};
use rustc_span::edit_distance::find_best_match_for_name; use rustc_span::edit_distance::{edit_distance, find_best_match_for_name};
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
use rustc_span::hygiene::MacroKind; use rustc_span::hygiene::MacroKind;
use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw, sym}; use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw, sym};
@ -2874,23 +2874,35 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
) )
.with_span_label(lifetime_ref.ident.span, "undeclared lifetime") .with_span_label(lifetime_ref.ident.span, "undeclared lifetime")
}; };
self.suggest_introducing_lifetime(
&mut err, // Check if this is a typo of `'static`.
Some(lifetime_ref.ident.name.as_str()), if edit_distance(lifetime_ref.ident.name.as_str(), "'static", 2).is_some() {
|err, _, span, message, suggestion, span_suggs| { err.span_suggestion_verbose(
err.multipart_suggestion_with_style( lifetime_ref.ident.span,
message, "you may have misspelled the `'static` lifetime",
std::iter::once((span, suggestion)).chain(span_suggs.clone()).collect(), "'static",
Applicability::MaybeIncorrect, Applicability::MachineApplicable,
if span_suggs.is_empty() { );
SuggestionStyle::ShowCode } else {
} else { self.suggest_introducing_lifetime(
SuggestionStyle::ShowAlways &mut err,
}, Some(lifetime_ref.ident.name.as_str()),
); |err, _, span, message, suggestion, span_suggs| {
true err.multipart_suggestion_with_style(
}, message,
); std::iter::once((span, suggestion)).chain(span_suggs.clone()).collect(),
Applicability::MaybeIncorrect,
if span_suggs.is_empty() {
SuggestionStyle::ShowCode
} else {
SuggestionStyle::ShowAlways
},
);
true
},
);
}
err.emit(); err.emit();
} }

View file

@ -0,0 +1,7 @@
fn stati<T: 'stati>() {}
//~^ ERROR use of undeclared lifetime name `'stati`
fn statoc<T: 'statoc>() {}
//~^ ERROR use of undeclared lifetime name `'statoc`
fn main() {}

View file

@ -0,0 +1,26 @@
error[E0261]: use of undeclared lifetime name `'stati`
--> $DIR/static-typos.rs:1:13
|
LL | fn stati<T: 'stati>() {}
| ^^^^^^ undeclared lifetime
|
help: you may have misspelled the `'static` lifetime
|
LL | fn stati<T: 'static>() {}
| +
error[E0261]: use of undeclared lifetime name `'statoc`
--> $DIR/static-typos.rs:4:14
|
LL | fn statoc<T: 'statoc>() {}
| ^^^^^^^ undeclared lifetime
|
help: you may have misspelled the `'static` lifetime
|
LL - fn statoc<T: 'statoc>() {}
LL + fn statoc<T: 'static>() {}
|
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0261`.