pub struct DeconstructedPat<'p, 'tcx> {
    ctor: Constructor<'tcx>,
    fields: &'p [DeconstructedPat<'p, 'tcx>],
    ty: Ty<'tcx>,
    span: Span,
    useful: Cell<bool>,
}
Expand description

Values and patterns can be represented as a constructor applied to some fields. This represents a pattern in this form. This also uses interior mutability to keep track of whether the pattern has been found reachable during analysis. For this reason they cannot be cloned. A DeconstructedPat will almost always come from user input; the only exception are some Wildcards introduced during specialization.

Note that the number of fields may not match the fields declared in the original struct/variant. This happens if a private or non_exhaustive field is uninhabited, because the code mustn’t observe that it is uninhabited. In that case that field is not included in fields. Care must be taken when converting to/from thir::Pat.

Fields§

§ctor: Constructor<'tcx>§fields: &'p [DeconstructedPat<'p, 'tcx>]§ty: Ty<'tcx>§span: Span§useful: Cell<bool>

Whether removing this arm would change the behavior of the match expression.

Implementations§

source§

impl<'p, 'tcx> DeconstructedPat<'p, 'tcx>

source

pub fn wildcard(ty: Ty<'tcx>, span: Span) -> Self

source

pub fn new( ctor: Constructor<'tcx>, fields: &'p [DeconstructedPat<'p, 'tcx>], ty: Ty<'tcx>, span: Span ) -> Self

source

pub(crate) fn is_or_pat(&self) -> bool

source

pub(crate) fn flatten_or_pat(&'p self) -> SmallVec<[&'p Self; 1]>

Expand this (possibly-nested) or-pattern into its alternatives.

source

pub fn ctor(&self) -> &Constructor<'tcx>

source

pub fn ty(&self) -> Ty<'tcx>

source

pub fn span(&self) -> Span

source

pub fn iter_fields<'a>( &'a self ) -> impl Iterator<Item = &'p DeconstructedPat<'p, 'tcx>> + Captures<'a>

source

pub(crate) fn specialize<'a>( &'a self, pcx: &PatCtxt<'_, 'p, 'tcx>, other_ctor: &Constructor<'tcx> ) -> SmallVec<[&'p DeconstructedPat<'p, 'tcx>; 2]>

Specialize this pattern with a constructor. other_ctor can be different from self.ctor, but must be covered by it.

source

pub(crate) fn set_useful(&self)

We keep track for each pattern if it was ever useful during the analysis. This is used with redundant_spans to report redundant subpatterns arising from or patterns.

source

pub(crate) fn is_useful(&self) -> bool

source

pub(crate) fn redundant_spans(&self) -> Vec<Span>

Report the spans of subpatterns that were not useful, if any.

source

fn collect_redundant_spans(&self, spans: &mut Vec<Span>)

Trait Implementations§

source§

impl<'p, 'tcx> Debug for DeconstructedPat<'p, 'tcx>

This is mostly copied from the Pat impl. This is best effort and not good enough for a Display impl.

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'p, 'tcx> !RefUnwindSafe for DeconstructedPat<'p, 'tcx>

§

impl<'p, 'tcx> !Send for DeconstructedPat<'p, 'tcx>

§

impl<'p, 'tcx> !Sync for DeconstructedPat<'p, 'tcx>

§

impl<'p, 'tcx> Unpin for DeconstructedPat<'p, 'tcx>

§

impl<'p, 'tcx> !UnwindSafe for DeconstructedPat<'p, 'tcx>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.

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: 96 bytes