pub enum Constructor<Cx: PatCx> {
Show 20 variants
Struct,
Variant(Cx::VariantIdx),
Ref,
Slice(Slice),
UnionField,
Bool(bool),
IntRange(IntRange),
F16Range(IeeeFloat<HalfS>, IeeeFloat<HalfS>, RangeEnd),
F32Range(IeeeFloat<SingleS>, IeeeFloat<SingleS>, RangeEnd),
F64Range(IeeeFloat<DoubleS>, IeeeFloat<DoubleS>, RangeEnd),
F128Range(IeeeFloat<QuadS>, IeeeFloat<QuadS>, RangeEnd),
Str(Cx::StrLit),
Opaque(OpaqueId),
Or,
Wildcard,
Never,
NonExhaustive,
Hidden,
Missing,
PrivateUninhabited,
}
Expand description
A value can be decomposed into a constructor applied to some fields. This struct represents
the constructor. See also Fields
.
pat_constructor
retrieves the constructor corresponding to a pattern.
specialize_constructor
returns the list of fields corresponding to a pattern, given a
constructor. Constructor::apply
reconstructs the pattern from a pair of Constructor
and
Fields
.
Variants§
Struct
Tuples and structs.
Variant(Cx::VariantIdx)
Enum variants.
Ref
References
Slice(Slice)
Array and slice patterns.
UnionField
Union field accesses.
Bool(bool)
Booleans
IntRange(IntRange)
Ranges of integer literal values (2
, 2..=5
or 2..5
).
F16Range(IeeeFloat<HalfS>, IeeeFloat<HalfS>, RangeEnd)
Ranges of floating-point literal values (2.0..=5.2
).
F32Range(IeeeFloat<SingleS>, IeeeFloat<SingleS>, RangeEnd)
F64Range(IeeeFloat<DoubleS>, IeeeFloat<DoubleS>, RangeEnd)
F128Range(IeeeFloat<QuadS>, IeeeFloat<QuadS>, RangeEnd)
Str(Cx::StrLit)
String literals. Strings are not quite the same as &[u8]
so we treat them separately.
Opaque(OpaqueId)
Constants that must not be matched structurally. They are treated as black boxes for the
purposes of exhaustiveness: we must not inspect them, and they don’t count towards making a
match exhaustive.
Carries an id that must be unique within a match. We need this to ensure the invariants of
SplitConstructorSet
.
Or
Or-pattern.
Wildcard
Wildcard pattern.
Never
Never pattern. Only used in WitnessPat
. An actual never pattern should be lowered as
Wildcard
.
NonExhaustive
Fake extra constructor for enums that aren’t allowed to be matched exhaustively. Also used
for those types for which we cannot list constructors explicitly, like f64
and str
. Only
used in WitnessPat
.
Hidden
Fake extra constructor for variants that should not be mentioned in diagnostics. We use this
for variants behind an unstable gate as well as #[doc(hidden)]
ones. Only used in
WitnessPat
.
Missing
Fake extra constructor for constructors that are not seen in the matrix, as explained at the top of the file. Only used for specialization.
PrivateUninhabited
Fake extra constructor that indicates and empty field that is private. When we encounter one we skip the column entirely so we don’t observe its emptiness. Only used for specialization.
Implementations§
source§impl<Cx: PatCx> Constructor<Cx>
impl<Cx: PatCx> Constructor<Cx>
pub(crate) fn is_non_exhaustive(&self) -> bool
pub(crate) fn as_variant(&self) -> Option<Cx::VariantIdx>
fn as_bool(&self) -> Option<bool>
pub(crate) fn as_int_range(&self) -> Option<&IntRange>
fn as_slice(&self) -> Option<Slice>
sourcepub(crate) fn arity(&self, cx: &Cx, ty: &Cx::Ty) -> usize
pub(crate) fn arity(&self, cx: &Cx, ty: &Cx::Ty) -> usize
The number of fields for this constructor. This must be kept in sync with
Fields::wildcards
.
sourcepub(crate) fn is_covered_by(
&self,
cx: &Cx,
other: &Self,
) -> Result<bool, Cx::Error>
pub(crate) fn is_covered_by( &self, cx: &Cx, other: &Self, ) -> Result<bool, Cx::Error>
Returns whether self
is covered by other
, i.e. whether self
is a subset of other
.
For the simple cases, this is simply checking for equality. For the “grouped” constructors,
this checks for inclusion.
pub(crate) fn fmt_fields( &self, f: &mut Formatter<'_>, ty: &Cx::Ty, fields: impl Iterator<Item = impl Debug>, ) -> Result
Trait Implementations§
source§impl<Cx: PatCx> Clone for Constructor<Cx>
impl<Cx: PatCx> Clone for Constructor<Cx>
Auto Trait Implementations§
impl<Cx> DynSend for Constructor<Cx>
impl<Cx> DynSync for Constructor<Cx>
impl<Cx> Freeze for Constructor<Cx>
impl<Cx> RefUnwindSafe for Constructor<Cx>
impl<Cx> Send for Constructor<Cx>
impl<Cx> Sync for Constructor<Cx>
impl<Cx> Unpin for Constructor<Cx>
impl<Cx> UnwindSafe for Constructor<Cx>
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)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<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.