Struct rustc_mir_build::thir::pattern::deconstruct_pat::DeconstructedPat
source · pub(crate) struct DeconstructedPat<'p, 'tcx> {
ctor: Constructor<'tcx>,
fields: Fields<'p, 'tcx>,
ty: Ty<'tcx>,
span: Span,
reachable: 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.
Fields§
§ctor: Constructor<'tcx>§fields: Fields<'p, 'tcx>§ty: Ty<'tcx>§span: Span§reachable: Cell<bool>Implementations§
source§impl<'p, 'tcx> DeconstructedPat<'p, 'tcx>
impl<'p, 'tcx> DeconstructedPat<'p, 'tcx>
pub(super) fn wildcard(ty: Ty<'tcx>, span: Span) -> Self
pub(super) fn new( ctor: Constructor<'tcx>, fields: Fields<'p, 'tcx>, ty: Ty<'tcx>, span: Span ) -> Self
sourcepub(crate) fn from_pat(cx: &MatchCheckCtxt<'p, 'tcx>, pat: &Pat<'tcx>) -> Self
pub(crate) fn from_pat(cx: &MatchCheckCtxt<'p, 'tcx>, pat: &Pat<'tcx>) -> Self
Note: the input patterns must have been lowered through
super::check_match::MatchVisitor::lower_pattern.
pub(super) fn is_or_pat(&self) -> bool
sourcepub(super) fn flatten_or_pat(&'p self) -> SmallVec<[&'p Self; 1]>
pub(super) fn flatten_or_pat(&'p self) -> SmallVec<[&'p Self; 1]>
Expand this (possibly-nested) or-pattern into its alternatives.
pub(super) fn ctor(&self) -> &Constructor<'tcx>
pub(super) fn ty(&self) -> Ty<'tcx>
pub(super) fn span(&self) -> Span
pub(super) fn iter_fields<'a>( &'a self ) -> impl Iterator<Item = &'p DeconstructedPat<'p, 'tcx>> + Captures<'a>
sourcepub(super) fn specialize<'a>(
&'a self,
pcx: &PatCtxt<'_, 'p, 'tcx>,
other_ctor: &Constructor<'tcx>
) -> SmallVec<[&'p DeconstructedPat<'p, 'tcx>; 2]>
pub(super) 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.
sourcepub(super) fn set_reachable(&self)
pub(super) fn set_reachable(&self)
We keep track for each pattern if it was ever reachable during the analysis. This is used
with unreachable_spans to report unreachable subpatterns arising from or patterns.
pub(super) fn is_reachable(&self) -> bool
sourcepub(super) fn unreachable_spans(&self) -> Vec<Span>
pub(super) fn unreachable_spans(&self) -> Vec<Span>
Report the spans of subpatterns that were not reachable, if any.
fn collect_unreachable_spans(&self, spans: &mut Vec<Span>)
Trait Implementations§
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> 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
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