pub(super) struct PatMigration<'a> {
suggestion: Vec<(Span, String)>,
ref_pattern_count: usize,
binding_mode_count: usize,
default_mode_span: Option<(Span, Mutability)>,
default_mode_labels: FxIndexMap<Span, Mutability>,
info: &'a Rust2024IncompatiblePatInfo,
}Expand description
For patterns flagged for migration during HIR typeck, this handles constructing and emitting a diagnostic suggestion.
Fields§
§suggestion: Vec<(Span, String)>§ref_pattern_count: usize§binding_mode_count: usize§default_mode_span: Option<(Span, Mutability)>Internal state: the ref-mutability of the default binding mode at the subpattern being
lowered, with the span where it was introduced. None for a by-value default mode.
default_mode_labels: FxIndexMap<Span, Mutability>Labels for where incompatibility-causing by-ref default binding modes were introduced.
info: &'a Rust2024IncompatiblePatInfoInformation collected from typeck, including spans for subpatterns invalid in Rust 2024.
Implementations§
Source§impl<'a> PatMigration<'a>
impl<'a> PatMigration<'a>
pub(super) fn new(info: &'a Rust2024IncompatiblePatInfo) -> Self
Sourcepub(super) fn emit<'tcx>(self, tcx: TyCtxt<'tcx>, pat_id: HirId)
pub(super) fn emit<'tcx>(self, tcx: TyCtxt<'tcx>, pat_id: HirId)
On Rust 2024, this emits a hard error. On earlier Editions, this emits the
future-incompatibility lint rust_2024_incompatible_pat.
Sourcepub(super) fn visit_implicit_derefs<'tcx>(
&mut self,
pat_span: Span,
adjustments: &[PatAdjustment<'tcx>],
) -> Option<(Span, Mutability)>
pub(super) fn visit_implicit_derefs<'tcx>( &mut self, pat_span: Span, adjustments: &[PatAdjustment<'tcx>], ) -> Option<(Span, Mutability)>
Tracks when we’re lowering a pattern that implicitly dereferences the scrutinee.
This should only be called when the pattern type adjustments list adjustments contains an
implicit deref of a reference type. Returns the prior default binding mode; this should be
followed by a call to PatMigration::leave_ref to restore it when we leave the pattern.
Sourcepub(super) fn visit_explicit_deref(&mut self) -> Option<(Span, Mutability)>
pub(super) fn visit_explicit_deref(&mut self) -> Option<(Span, Mutability)>
Tracks the default binding mode when we’re lowering a & or &mut pattern.
Returns the prior default binding mode; this should be followed by a call to
PatMigration::leave_ref to restore it when we leave the pattern.
Sourcepub(super) fn leave_ref(&mut self, old_mode_span: Option<(Span, Mutability)>)
pub(super) fn leave_ref(&mut self, old_mode_span: Option<(Span, Mutability)>)
Restores the default binding mode after lowering a pattern that could change it.
This should follow a call to either PatMigration::visit_explicit_deref or
PatMigration::visit_implicit_derefs.
Sourcepub(super) fn visit_binding(
&mut self,
pat_span: Span,
mode: BindingMode,
explicit_ba: BindingMode,
ident: Ident,
)
pub(super) fn visit_binding( &mut self, pat_span: Span, mode: BindingMode, explicit_ba: BindingMode, ident: Ident, )
Determines if a binding is relevant to the diagnostic and adjusts the notes/suggestion if so. Bindings are relevant if they have a modifier under a by-ref default mode (invalid in Rust 2024) or if we need to suggest a binding modifier for them.
Auto Trait Implementations§
impl<'a> DynSend for PatMigration<'a>
impl<'a> DynSync for PatMigration<'a>
impl<'a> Freeze for PatMigration<'a>
impl<'a> RefUnwindSafe for PatMigration<'a>
impl<'a> Send for PatMigration<'a>
impl<'a> Sync for PatMigration<'a>
impl<'a> Unpin for PatMigration<'a>
impl<'a> UnwindSafe for PatMigration<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 120 bytes