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 Rust2024IncompatiblePatInfo
Information 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: &[Ty<'tcx>],
) -> Option<(Span, Mutability)>
pub(super) fn visit_implicit_derefs<'tcx>( &mut self, pat_span: Span, adjustments: &[Ty<'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
is
non-empty. 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