Enum rustc_mir_build::thir::pattern::deconstruct_pat::Fields[−][src]

pub(super) enum Fields<'p, 'tcx> {
    Slice(&'p [Pat<'tcx>]),
    Vec(SmallVec<[&'p Pat<'tcx>; 2]>),
    Filtered {
        fields: SmallVec<[FilteredField<'p, 'tcx>; 2]>,
        len: usize,
    },
}
Expand description

A value can be decomposed into a constructor applied to some fields. This struct represents those fields, generalized to allow patterns in each field. See also Constructor. This is constructed from a constructor using Fields::wildcards().

If a private or non_exhaustive field is uninhabited, the code mustn’t observe that it is uninhabited. For that, we filter these fields out of the matrix. This is handled automatically in Fields. This filtering is uncommon in practice, because uninhabited fields are rarely used, so we avoid it when possible to preserve performance.

Variants

Slice(&'p [Pat<'tcx>])
Expand description

Lists of patterns that don’t contain any filtered fields. Slice and Vec behave the same; the difference is only to avoid allocating and triple-dereferences when possible. Frankly this is premature optimization, I (Nadrieril) have not measured if it really made a difference.

Vec(SmallVec<[&'p Pat<'tcx>; 2]>)
Filtered
Expand description

Patterns where some of the fields need to be hidden. For all intents and purposes we only care about the non-hidden fields. We need to keep the real field index for those fields; we’re morally storing a Vec<(usize, &Pat)> but what we do is more convenient. len counts the number of non-hidden fields

Show fields

Fields of Filtered

fields: SmallVec<[FilteredField<'p, 'tcx>; 2]>len: usize

Implementations

impl<'p, 'tcx> Fields<'p, 'tcx>[src]

fn from_single_pattern(pat: &'p Pat<'tcx>) -> Self[src]

Internal use. Use Fields::wildcards() instead. Must not be used if the pattern is a field of a struct/tuple/variant.

fn wildcards_from_tys(
    cx: &MatchCheckCtxt<'p, 'tcx>,
    tys: impl IntoIterator<Item = Ty<'tcx>>
) -> Self
[src]

Convenience; internal use.

pub(super) fn wildcards(
    pcx: PatCtxt<'_, 'p, 'tcx>,
    constructor: &Constructor<'tcx>
) -> Self
[src]

Creates a new list of wildcard fields for a given constructor.

pub(super) fn apply(
    self,
    pcx: PatCtxt<'_, 'p, 'tcx>,
    ctor: &Constructor<'tcx>
) -> Pat<'tcx>
[src]

Apply a constructor to a list of patterns, yielding a new pattern. self must have as many elements as this constructor’s arity.

This is roughly the inverse of specialize_constructor.

Examples: ctor: Constructor::Single ty: Foo(u32, u32, u32) self: [10, 20, _] returns Foo(10, 20, _)

ctor: Constructor::Variant(Option::Some) ty: Option<bool> self: [false] returns Some(false)

pub(super) fn len(&self) -> usize[src]

Returns the number of patterns. This is the same as the arity of the constructor used to construct self.

fn patterns_and_indices(&self) -> SmallVec<[(Field, &'p Pat<'tcx>); 2]>[src]

Returns the list of patterns along with the corresponding field indices.

pub(super) fn into_patterns(self) -> SmallVec<[&'p Pat<'tcx>; 2]>[src]

Returns the list of patterns.

fn replace_with_fieldpats(
    &self,
    new_pats: impl IntoIterator<Item = &'p FieldPat<'tcx>>
) -> Self
[src]

Overrides some of the fields with the provided patterns. Exactly like replace_fields_indexed, except that it takes FieldPats as input.

fn replace_fields_indexed(
    &self,
    new_pats: impl IntoIterator<Item = (usize, &'p Pat<'tcx>)>
) -> Self
[src]

Overrides some of the fields with the provided patterns. This is used when a pattern defines some fields but not all, for example Foo { field1: Some(_), .. }: here we start with a Fields that is just one wildcard per field of the Foo struct, and override the entry corresponding to field1 with the pattern Some(_). This is also used for slice patterns for the same reason.

pub(super) fn replace_fields(
    &self,
    cx: &MatchCheckCtxt<'p, 'tcx>,
    pats: impl IntoIterator<Item = Pat<'tcx>>
) -> Self
[src]

Replaces contained fields with the given list of patterns. There must be len() patterns in pats.

pub(super) fn replace_with_pattern_arguments(&self, pat: &'p Pat<'tcx>) -> Self[src]

Replaces contained fields with the arguments of the given pattern. Only use on a pattern that is compatible with the constructor used to build self. This is meant to be used on the result of Fields::wildcards(). The idea is that wildcards constructs a list of fields where all entries are wildcards, and the pattern provided to this function fills some of the fields with non-wildcards. In the following example Fields::wildcards would return [_, _, _, _]. If we call replace_with_pattern_arguments on it with the pattern, the result will be [Some(0), _, _, _].

let x: [Option<u8>; 4] = foo();
match x {
    [Some(0), ..] => {}
}

This is guaranteed to preserve the number of patterns in self.

Trait Implementations

impl<'p, 'tcx> Clone for Fields<'p, 'tcx>[src]

fn clone(&self) -> Fields<'p, 'tcx>[src]

Returns a copy of the value. Read more

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl<'p, 'tcx> Debug for Fields<'p, 'tcx>[src]

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

Formats the value using the given formatter. Read more

Auto Trait Implementations

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

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

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

impl<'p, 'tcx> Unpin for Fields<'p, 'tcx> where
    'tcx: 'p, 

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

Blanket Implementations

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

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized, 
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized, 
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T> ToOwned for T where
    T: Clone, 
[src]

type Owned = T

The resulting type after obtaining ownership.

pub fn to_owned(&self) -> T[src]

Creates owned data from borrowed data, usually by cloning. Read more

pub fn clone_into(&self, target: &mut T)[src]

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

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

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

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

Performs the conversion.

impl<'a, T> Captures<'a> for T where
    T: ?Sized, 
[src]