ra_ap_rustc_pattern_analysis::constructor

Struct SplitConstructorSet

Source
pub struct SplitConstructorSet<Cx: PatCx> {
    pub present: SmallVec<[Constructor<Cx>; 1]>,
    pub missing: Vec<Constructor<Cx>>,
    pub missing_empty: Vec<Constructor<Cx>>,
}
Expand description

Describes the result of analyzing the constructors in a column of a match.

present is morally the set of constructors present in the column, and missing is the set of constructors that exist in the type but are not present in the column.

More formally, if we discard wildcards from the column, this respects the following constraints:

  1. the union of present, missing and missing_empty covers all the constructors of the type
  2. each constructor in present is covered by something in the column
  3. no constructor in missing or missing_empty is covered by anything in the column
  4. each constructor in the column is equal to the union of one or more constructors in present
  5. missing does not contain empty constructors (see discussion about emptiness at the top of the file);
  6. missing_empty contains only empty constructors
  7. constructors in present, missing and missing_empty are split for the column; in other words, they are either fully included in or fully disjoint from each constructor in the column. In yet other words, there are no non-trivial intersections like between 0..10 and 5..15.

We must be particularly careful with weird constructors like Opaque: they’re not formally part of the ConstructorSet for the type, yet if we forgot to include them in present we would be ignoring any row with Opaques in the algorithm. Hence the importance of point 4.

Fields§

§present: SmallVec<[Constructor<Cx>; 1]>§missing: Vec<Constructor<Cx>>§missing_empty: Vec<Constructor<Cx>>

Trait Implementations§

Source§

impl<Cx: Debug + PatCx> Debug for SplitConstructorSet<Cx>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<Cx> Freeze for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: Freeze, <Cx as PatCx>::StrLit: Freeze,

§

impl<Cx> RefUnwindSafe for SplitConstructorSet<Cx>

§

impl<Cx> Send for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: Send, <Cx as PatCx>::StrLit: Send,

§

impl<Cx> Sync for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: Sync, <Cx as PatCx>::StrLit: Sync,

§

impl<Cx> Unpin for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: Unpin, <Cx as PatCx>::StrLit: Unpin,

§

impl<Cx> UnwindSafe for SplitConstructorSet<Cx>

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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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>,

Source§

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>,

Source§

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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

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