Don't use kw::Empty
in hir::Lifetime::ident
.
`hir::Lifetime::ident` currently sometimes uses `kw::Empty` for elided lifetimes and sometimes uses `kw::UnderscoreLifetime`, and the distinction is used when creating some error suggestions, e.g. in `Lifetime::suggestion` and `ImplicitLifetimeFinder::visit_ty`. I found this *really* confusing, and it took me a while to understand what was going on. This commit replaces all uses of `kw::Empty` in `hir::Lifetime::ident` with `kw::UnderscoreLifetime`. It adds a new field `hir::Lifetime::is_path_anon` that mostly replaces the old empty/underscore distinction and makes things much clearer. Some other notable changes: - Adds a big comment to `Lifetime` talking about permissable field values. - Adds some assertions in `new_named_lifetime` about what ident values are permissible for the different `LifetimeRes` values. - Adds a `Lifetime::new` constructor that does some checking to make sure the `is_elided` and `is_anonymous` states are valid. - `add_static_impl_trait_suggestion` now looks at `Lifetime::res` instead of the ident when creating the suggestion. This is the one case where `is_path_anon` doesn't replace the old empty/underscore distinction. - A couple of minor pretty-printing improvements.
This commit is contained in:
parent
cfd00f9c16
commit
8d2c63f514
9 changed files with 136 additions and 51 deletions
|
@ -9,7 +9,7 @@ use rustc_errors::{
|
|||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::intravisit::{Visitor, VisitorExt, walk_ty};
|
||||
use rustc_hir::{self as hir, AmbigArg, FnRetTy, GenericParamKind, Node};
|
||||
use rustc_hir::{self as hir, AmbigArg, FnRetTy, GenericParamKind, IsAnonInPath, Node};
|
||||
use rustc_macros::{Diagnostic, Subdiagnostic};
|
||||
use rustc_middle::ty::print::{PrintTraitRefExt as _, TraitRefPrintOnlyTraitPath};
|
||||
use rustc_middle::ty::{self, Binder, ClosureKind, FnSig, Region, Ty, TyCtxt};
|
||||
|
@ -567,10 +567,14 @@ impl Subdiagnostic for AddLifetimeParamsSuggestion<'_> {
|
|||
|
||||
impl<'v> Visitor<'v> for ImplicitLifetimeFinder {
|
||||
fn visit_ty(&mut self, ty: &'v hir::Ty<'v, AmbigArg>) {
|
||||
let make_suggestion = |ident: Ident| {
|
||||
if ident.name == kw::Empty && ident.span.is_empty() {
|
||||
let make_suggestion = |lifetime: &hir::Lifetime| {
|
||||
if lifetime.is_anon_in_path == IsAnonInPath::Yes
|
||||
&& lifetime.ident.span.is_empty()
|
||||
{
|
||||
format!("{}, ", self.suggestion_param_name)
|
||||
} else if ident.name == kw::UnderscoreLifetime && ident.span.is_empty() {
|
||||
} else if lifetime.ident.name == kw::UnderscoreLifetime
|
||||
&& lifetime.ident.span.is_empty()
|
||||
{
|
||||
format!("{} ", self.suggestion_param_name)
|
||||
} else {
|
||||
self.suggestion_param_name.clone()
|
||||
|
@ -584,7 +588,7 @@ impl Subdiagnostic for AddLifetimeParamsSuggestion<'_> {
|
|||
matches!(
|
||||
arg,
|
||||
hir::GenericArg::Lifetime(lifetime)
|
||||
if lifetime.ident.name == kw::Empty
|
||||
if lifetime.is_anon_in_path == IsAnonInPath::Yes
|
||||
)
|
||||
}) {
|
||||
self.suggestions.push((
|
||||
|
@ -605,7 +609,7 @@ impl Subdiagnostic for AddLifetimeParamsSuggestion<'_> {
|
|||
{
|
||||
self.suggestions.push((
|
||||
lifetime.ident.span,
|
||||
make_suggestion(lifetime.ident),
|
||||
make_suggestion(lifetime),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@ -614,8 +618,7 @@ impl Subdiagnostic for AddLifetimeParamsSuggestion<'_> {
|
|||
}
|
||||
}
|
||||
hir::TyKind::Ref(lifetime, ..) if lifetime.is_anonymous() => {
|
||||
self.suggestions
|
||||
.push((lifetime.ident.span, make_suggestion(lifetime.ident)));
|
||||
self.suggestions.push((lifetime.ident.span, make_suggestion(lifetime)));
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue