Rollup merge of #136577 - dianne:simple-pat-migration-simplification, r=Nadrieril
Pattern Migration 2024: try to suggest eliding redundant binding modifiers This is based on #136475. Only the last commit is new. This is a simpler, more restrictive alternative to #136496, meant to partially address #136047. If a pattern can be migrated to Rust 2024 solely by removing redundant binding modifiers, this will make that suggestion; otherwise, it uses the old suggestion of making the pattern fully explicit. Relevant tracking issue: #131414 ``@rustbot`` label A-diagnostics A-patterns A-edition-2024 r? ``@Nadrieril``
This commit is contained in:
commit
20f9e973d9
15 changed files with 1043 additions and 262 deletions
|
@ -94,7 +94,7 @@ pub use self::sty::{
|
|||
pub use self::trait_def::TraitDef;
|
||||
pub use self::typeck_results::{
|
||||
CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
|
||||
TypeckResults, UserType, UserTypeAnnotationIndex, UserTypeKind,
|
||||
Rust2024IncompatiblePatInfo, TypeckResults, UserType, UserTypeAnnotationIndex, UserTypeKind,
|
||||
};
|
||||
pub use self::visit::{TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor};
|
||||
use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
|
||||
|
|
|
@ -73,9 +73,9 @@ pub struct TypeckResults<'tcx> {
|
|||
/// Stores the actual binding mode for all instances of [`BindingMode`].
|
||||
pat_binding_modes: ItemLocalMap<BindingMode>,
|
||||
|
||||
/// Top-level patterns whose match ergonomics need to be desugared by the Rust 2021 -> 2024
|
||||
/// migration lint. Problematic subpatterns are stored in the `Vec` for the lint to highlight.
|
||||
rust_2024_migration_desugared_pats: ItemLocalMap<Vec<(Span, String)>>,
|
||||
/// Top-level patterns incompatible with Rust 2024's match ergonomics. These will be translated
|
||||
/// to a form valid in all Editions, either as a lint diagnostic or hard error.
|
||||
rust_2024_migration_desugared_pats: ItemLocalMap<Rust2024IncompatiblePatInfo>,
|
||||
|
||||
/// Stores the types which were implicitly dereferenced in pattern binding modes
|
||||
/// for later usage in THIR lowering. For example,
|
||||
|
@ -420,7 +420,7 @@ impl<'tcx> TypeckResults<'tcx> {
|
|||
|
||||
pub fn rust_2024_migration_desugared_pats(
|
||||
&self,
|
||||
) -> LocalTableInContext<'_, Vec<(Span, String)>> {
|
||||
) -> LocalTableInContext<'_, Rust2024IncompatiblePatInfo> {
|
||||
LocalTableInContext {
|
||||
hir_owner: self.hir_owner,
|
||||
data: &self.rust_2024_migration_desugared_pats,
|
||||
|
@ -429,7 +429,7 @@ impl<'tcx> TypeckResults<'tcx> {
|
|||
|
||||
pub fn rust_2024_migration_desugared_pats_mut(
|
||||
&mut self,
|
||||
) -> LocalTableInContextMut<'_, Vec<(Span, String)>> {
|
||||
) -> LocalTableInContextMut<'_, Rust2024IncompatiblePatInfo> {
|
||||
LocalTableInContextMut {
|
||||
hir_owner: self.hir_owner,
|
||||
data: &mut self.rust_2024_migration_desugared_pats,
|
||||
|
@ -811,3 +811,17 @@ impl<'tcx> std::fmt::Display for UserTypeKind<'tcx> {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Information on a pattern incompatible with Rust 2024, for use by the error/migration diagnostic
|
||||
/// emitted during THIR construction.
|
||||
#[derive(TyEncodable, TyDecodable, Debug, HashStable)]
|
||||
pub struct Rust2024IncompatiblePatInfo {
|
||||
/// Labeled spans for `&`s, `&mut`s, and binding modifiers incompatible with Rust 2024.
|
||||
pub primary_labels: Vec<(Span, String)>,
|
||||
/// Whether any binding modifiers occur under a non-`move` default binding mode.
|
||||
pub bad_modifiers: bool,
|
||||
/// Whether any `&` or `&mut` patterns occur under a non-`move` default binding mode.
|
||||
pub bad_ref_pats: bool,
|
||||
/// If `true`, we can give a simpler suggestion solely by eliding explicit binding modifiers.
|
||||
pub suggest_eliding_modes: bool,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue