pub struct ConstEvalCtxt<'tcx> {
tcx: TyCtxt<'tcx>,
typing_env: TypingEnv<'tcx>,
typeck: &'tcx TypeckResults<'tcx>,
source: Cell<ConstantSource>,
}
Expand description
The context required to evaluate a constant expression.
This is currently limited to constant folding and reading the value of named constants.
See the module level documentation for some context.
Fields§
§tcx: TyCtxt<'tcx>
§typing_env: TypingEnv<'tcx>
§typeck: &'tcx TypeckResults<'tcx>
§source: Cell<ConstantSource>
Implementations§
Source§impl<'tcx> ConstEvalCtxt<'tcx>
impl<'tcx> ConstEvalCtxt<'tcx>
Sourcepub fn new(cx: &LateContext<'tcx>) -> Self
pub fn new(cx: &LateContext<'tcx>) -> Self
Creates the evaluation context from the lint context. This requires the lint context to be
in a body (i.e. cx.enclosing_body.is_some()
).
Sourcepub fn with_env(
tcx: TyCtxt<'tcx>,
typing_env: TypingEnv<'tcx>,
typeck: &'tcx TypeckResults<'tcx>,
) -> Self
pub fn with_env( tcx: TyCtxt<'tcx>, typing_env: TypingEnv<'tcx>, typeck: &'tcx TypeckResults<'tcx>, ) -> Self
Creates an evaluation context.
Sourcepub fn eval_with_source(
&self,
e: &Expr<'_>,
) -> Option<(Constant<'tcx>, ConstantSource)>
pub fn eval_with_source( &self, e: &Expr<'_>, ) -> Option<(Constant<'tcx>, ConstantSource)>
Attempts to evaluate the expression and returns both the value and whether it’s dependant on other items.
Sourcepub fn eval(&self, e: &Expr<'_>) -> Option<Constant<'tcx>>
pub fn eval(&self, e: &Expr<'_>) -> Option<Constant<'tcx>>
Attempts to evaluate the expression.
Sourcepub fn eval_simple(&self, e: &Expr<'_>) -> Option<Constant<'tcx>>
pub fn eval_simple(&self, e: &Expr<'_>) -> Option<Constant<'tcx>>
Attempts to evaluate the expression without accessing other items.
Sourcepub fn eval_full_int(&self, e: &Expr<'_>) -> Option<FullInt>
pub fn eval_full_int(&self, e: &Expr<'_>) -> Option<FullInt>
Attempts to evaluate the expression as an integer without accessing other items.
Sourcefn expr(&self, e: &Expr<'_>) -> Option<Constant<'tcx>>
fn expr(&self, e: &Expr<'_>) -> Option<Constant<'tcx>>
Simple constant folding: Insert an expression, get a constant or none.
Sourcepub fn eval_is_empty(&self, e: &Expr<'_>) -> Option<bool>
pub fn eval_is_empty(&self, e: &Expr<'_>) -> Option<bool>
Simple constant folding to determine if an expression is an empty slice, str, array, …
None
will be returned if the constness cannot be determined, or if the resolution
leaves the local crate.
fn constant_not(&self, o: &Constant<'tcx>, ty: Ty<'_>) -> Option<Constant<'tcx>>
fn constant_negate( &self, o: &Constant<'tcx>, ty: Ty<'_>, ) -> Option<Constant<'tcx>>
Sourcefn multi(&self, vec: &[Expr<'_>]) -> Option<Vec<Constant<'tcx>>>
fn multi(&self, vec: &[Expr<'_>]) -> Option<Vec<Constant<'tcx>>>
Create Some(Vec![..])
of all constants, unless there is any
non-constant part.
Sourcefn fetch_path_and_apply<T, F>(
&self,
qpath: &QPath<'_>,
id: HirId,
ty: Ty<'tcx>,
f: F,
) -> Option<T>
fn fetch_path_and_apply<T, F>( &self, qpath: &QPath<'_>, id: HirId, ty: Ty<'tcx>, f: F, ) -> Option<T>
Lookup a possibly constant expression from an ExprKind::Path
and apply a function on it.
fn index(&self, lhs: &Expr<'_>, index: &Expr<'_>) -> Option<Constant<'tcx>>
Sourcefn block(&self, block: &Block<'_>) -> Option<Constant<'tcx>>
fn block(&self, block: &Block<'_>) -> Option<Constant<'tcx>>
A block can only yield a constant if it has exactly one constant expression.
fn ifthenelse( &self, cond: &Expr<'_>, then: &Expr<'_>, otherwise: Option<&Expr<'_>>, ) -> Option<Constant<'tcx>>
fn binop( &self, op: BinOp, left: &Expr<'_>, right: &Expr<'_>, ) -> Option<Constant<'tcx>>
Auto Trait Implementations§
impl<'tcx> !Freeze for ConstEvalCtxt<'tcx>
impl<'tcx> !RefUnwindSafe for ConstEvalCtxt<'tcx>
impl<'tcx> !Send for ConstEvalCtxt<'tcx>
impl<'tcx> !Sync for ConstEvalCtxt<'tcx>
impl<'tcx> Unpin for ConstEvalCtxt<'tcx>
impl<'tcx> !UnwindSafe for ConstEvalCtxt<'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
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 moreLayout§
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: 48 bytes