Struct flux_middle::rty::Expr

source ·
pub struct Expr {
    kind: Interned<ExprKind>,
    espan: Option<ESpan>,
}

Fields§

§kind: Interned<ExprKind>§espan: Option<ESpan>

Implementations§

source§

impl Expr

source

pub fn at_opt(self, espan: Option<ESpan>) -> Expr

source

pub fn at(self, espan: ESpan) -> Expr

source

pub fn at_base(self, base: ESpan) -> Expr

source

pub fn span(&self) -> Option<ESpan>

source

pub fn tt() -> Expr

source

pub fn ff() -> Expr

source

pub fn and_from_iter(exprs: impl IntoIterator<Item = Expr>) -> Expr

source

pub fn or_from_iter(exprs: impl IntoIterator<Item = Expr>) -> Expr

source

pub fn and(e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn or(e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn zero() -> Expr

source

pub fn int_max(int_ty: IntTy) -> Expr

source

pub fn int_min(int_ty: IntTy) -> Expr

source

pub fn uint_max(uint_ty: UintTy) -> Expr

source

pub fn nu() -> Expr

source

pub fn is_nu(&self) -> bool

source

pub fn expect_adt(&self) -> (DefId, List<Expr>)

source

pub fn unit() -> Expr

source

pub fn var(var: Var) -> Expr

source

pub fn fvar(name: Name) -> Expr

source

pub fn evar(evar: EVar) -> Expr

source

pub fn bvar(debruijn: DebruijnIndex, var: BoundVar, kind: BoundReftKind) -> Expr

source

pub fn early_param(index: u32, name: Symbol) -> Expr

source

pub fn local(local: Local) -> Expr

source

pub fn constant(c: Constant) -> Expr

source

pub fn const_def_id(c: DefId) -> Expr

source

pub fn const_generic(param: ParamConst) -> Expr

source

pub fn aggregate(kind: AggregateKind, flds: List<Expr>) -> Expr

source

pub fn tuple(flds: List<Expr>) -> Expr

source

pub fn adt(def_id: DefId, flds: List<Expr>) -> Expr

source

pub fn from_bits(bty: &BaseTy, bits: u128) -> Expr

source

pub fn ite(p: impl Into<Expr>, e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn abs(lam: Lambda) -> Expr

source

pub fn hole(kind: HoleKind) -> Expr

source

pub fn kvar(kvar: KVar) -> Expr

source

pub fn alias(alias: AliasReft, args: List<Expr>) -> Expr

source

pub fn forall(expr: Binder<Expr>) -> Expr

source

pub fn binary_op(op: BinOp, e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn unit_adt(def_id: DefId) -> Expr

source

pub fn app(func: impl Into<Expr>, args: List<Expr>) -> Expr

source

pub fn global_func(func: Symbol, kind: SpecFuncKind) -> Expr

source

pub fn eq(e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn unary_op(op: UnOp, e: impl Into<Expr>) -> Expr

source

pub fn ne(e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn ge(e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn gt(e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn lt(e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn le(e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn implies(e1: impl Into<Expr>, e2: impl Into<Expr>) -> Expr

source

pub fn field_proj(e: impl Into<Expr>, proj: FieldProj) -> Expr

source

pub fn field_projs(e: impl Into<Expr>, projs: &[FieldProj]) -> Expr

source

pub fn path_proj(base: Expr, field: FieldIdx) -> Expr

source

pub fn not(&self) -> Expr

source

pub fn neg(&self) -> Expr

source

pub fn kind(&self) -> &ExprKind

source

pub fn is_atom(&self) -> bool

An expression is an atom if it is “self-delimiting”, i.e., it has a clear boundary when printed. This is used to avoid unnecessary parenthesis when pretty printing.

source

pub fn is_trivially_true(&self) -> bool

Simple syntactic check to see if the expression is a trivially true predicate. This is used mostly for filtering predicates when pretty printing but also to simplify types in general.

source

pub fn is_trivially_false(&self) -> bool

Simple syntactic check to see if the expression is a trivially false predicate.

source

fn is_true(&self) -> bool

Whether the expression is literally the constant true.

source

fn is_false(&self) -> bool

Whether the expression is literally the constant false.

source

pub fn from_const(tcx: TyCtxt<'_>, c: &Const) -> Expr

source

pub fn is_binary_op(&self) -> bool

source

fn const_op(op: &BinOp, c1: &Constant, c2: &Constant) -> Option<Constant>

source

pub fn simplify(&self) -> Expr

Simplify the expression by removing double negations, short-circuiting boolean connectives and doing constant folding. Note that we also have TypeFoldable::normalize which applies beta reductions for tuples and abstractions.

source

pub fn to_loc(&self) -> Option<Loc>

source

pub fn to_path(&self) -> Option<Path>

source

pub fn is_abs(&self) -> bool

source

pub fn is_unit(&self) -> bool

Whether this is an aggregate expression with no fields.

source

pub fn eta_expand_abs( &self, inputs: &BoundVariableKinds, output: Sort, ) -> Lambda

source

pub fn fold_sort(sort: &Sort, f: impl FnMut(&Sort) -> Expr) -> Expr

source

pub fn proj_and_reduce(&self, proj: FieldProj) -> Expr

Applies a field projection to an expression and optimistically try to beta reduce it

source

pub fn flatten_conjs(&self) -> Vec<&Expr>

Trait Implementations§

source§

impl<Rhs> Add<Rhs> for &Expr
where Rhs: Into<Expr>,

§

type Output = Expr

The resulting type after applying the + operator.
source§

fn add(self, rhs: Rhs) -> Self::Output

Performs the + operation. Read more
source§

impl<Rhs> Add<Rhs> for Expr
where Rhs: Into<Expr>,

§

type Output = Expr

The resulting type after applying the + operator.
source§

fn add(self, rhs: Rhs) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Expr

source§

fn clone(&self) -> Expr

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Expr

source§

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

Formats the value using the given formatter. Read more
source§

impl<__D: TyDecoder> Decodable<__D> for Expr

source§

fn decode(__decoder: &mut __D) -> Self

source§

impl<Rhs> Div<Rhs> for &Expr
where Rhs: Into<Expr>,

§

type Output = Expr

The resulting type after applying the / operator.
source§

fn div(self, rhs: Rhs) -> Self::Output

Performs the / operation. Read more
source§

impl<Rhs> Div<Rhs> for Expr
where Rhs: Into<Expr>,

§

type Output = Expr

The resulting type after applying the / operator.
source§

fn div(self, rhs: Rhs) -> Self::Output

Performs the / operation. Read more
source§

impl<__E: TyEncoder> Encodable<__E> for Expr

source§

fn encode(&self, __encoder: &mut __E)

source§

impl From<&Expr> for Expr

source§

fn from(e: &Expr) -> Self

Converts to this type from the input type.
source§

impl From<Name> for Expr

source§

fn from(name: Name) -> Self

Converts to this type from the input type.
source§

impl From<Path> for Expr

source§

fn from(path: Path) -> Self

Converts to this type from the input type.
source§

impl From<Var> for Expr

source§

fn from(var: Var) -> Self

Converts to this type from the input type.
source§

impl From<i32> for Expr

source§

fn from(value: i32) -> Self

Converts to this type from the input type.
source§

impl Hash for Expr

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<Rhs> Mul<Rhs> for &Expr
where Rhs: Into<Expr>,

§

type Output = Expr

The resulting type after applying the * operator.
source§

fn mul(self, rhs: Rhs) -> Self::Output

Performs the * operation. Read more
source§

impl<Rhs> Mul<Rhs> for Expr
where Rhs: Into<Expr>,

§

type Output = Expr

The resulting type after applying the * operator.
source§

fn mul(self, rhs: Rhs) -> Self::Output

Performs the * operation. Read more
source§

impl PartialEq for Expr

source§

fn eq(&self, other: &Expr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Pretty for Expr

source§

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

source§

fn default_cx(tcx: TyCtxt<'_>) -> PrettyCx<'_>

source§

impl SliceInternable for Expr

source§

fn storage() -> &'static InternStorage<[Self]>

source§

impl<Rhs> Sub<Rhs> for &Expr
where Rhs: Into<Expr>,

§

type Output = Expr

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Rhs) -> Self::Output

Performs the - operation. Read more
source§

impl<Rhs> Sub<Rhs> for Expr
where Rhs: Into<Expr>,

§

type Output = Expr

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Rhs) -> Self::Output

Performs the - operation. Read more
source§

impl TypeFoldable for Expr

source§

fn try_fold_with<F: FallibleTypeFolder>( &self, folder: &mut F, ) -> Result<Self, F::Error>

source§

fn fold_with<F: TypeFolder>(&self, folder: &mut F) -> Self

source§

fn normalize_projections<'tcx>( &self, genv: GlobalEnv<'_, 'tcx>, infcx: &InferCtxt<'tcx>, callsite_def_id: DefId, ) -> QueryResult<Self>

source§

fn normalize(&self, defns: &SpecFuncDefns) -> Self

Normalize expressions by applying beta reductions for tuples and lambda abstractions.
source§

fn replace_holes( &self, f: impl FnMut(&[BoundVariableKinds], HoleKind) -> Expr, ) -> Self

Replaces all holes with the result of calling a closure. The closure takes a list with all the layers of bound variables at the point the hole was found. Each layer corresponds to the list of bound variables at that level. The list is ordered from outermost to innermost binder, i.e., the last element is the binder closest to the hole.
source§

fn with_holes(&self) -> Self

Remove all refinements and turn each underlying BaseTy into a TyKind::Exists with a TyKind::Constr and a hole. For example, Vec<{v. i32[v] | v > 0}>[n] becomes {n. Vec<{v. i32[v] | *}>[n] | *}.
source§

fn replace_evars(&self, evars: &EVarSol) -> Self

source§

fn shift_in_escaping(&self, amount: u32) -> Self

source§

fn shift_out_escaping(&self, amount: u32) -> Self

source§

fn erase_regions(&self) -> Self

source§

impl TypeSuperFoldable for Expr

source§

fn try_super_fold_with<F: FallibleTypeFolder>( &self, folder: &mut F, ) -> Result<Self, F::Error>

source§

fn super_fold_with<F: TypeFolder>(&self, folder: &mut F) -> Self

source§

impl TypeSuperVisitable for Expr

source§

impl TypeVisitable for Expr

source§

fn visit_with<V: TypeVisitor>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy>

source§

fn has_escaping_bvars(&self) -> bool

source§

fn has_escaping_bvars_at_or_above(&self, binder: DebruijnIndex) -> bool

Returns true if self has any late-bound vars that are either bound by binder or bound by some binder outside of binder. If binder is ty::INNERMOST, this indicates whether there are any late-bound vars that appear free.
source§

fn fvars(&self) -> FxHashSet<Name>

Returns the set of all free variables. For example, Vec<i32[n]>{v : v > m} returns {n, m}.
source§

impl Eq for Expr

source§

impl StructuralPartialEq for Expr

Auto Trait Implementations§

§

impl Freeze for Expr

§

impl RefUnwindSafe for Expr

§

impl Send for Expr

§

impl Sync for Expr

§

impl Unpin for Expr

§

impl UnwindSafe for Expr

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> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
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> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
source§

impl<P> IntoQueryParam<P> for P

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

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

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.