pub struct LateContext<'tcx> {
pub tcx: TyCtxt<'tcx>,
pub enclosing_body: Option<BodyId>,
pub(crate) cached_typeck_results: Cell<Option<&'tcx TypeckResults<'tcx>>>,
pub param_env: ParamEnv<'tcx>,
pub effective_visibilities: &'tcx EffectiveVisibilities,
pub last_node_with_lint_attrs: HirId,
pub generics: Option<&'tcx Generics<'tcx>>,
pub only_module: bool,
}
Expand description
Context for lint checking outside of type inference.
Fields§
§tcx: TyCtxt<'tcx>
Type context we’re checking in.
enclosing_body: Option<BodyId>
Current body, or None
if outside a body.
cached_typeck_results: Cell<Option<&'tcx TypeckResults<'tcx>>>
Type-checking results for the current body. Access using the typeck_results
and maybe_typeck_results
methods, which handle querying the typeck results on demand.
param_env: ParamEnv<'tcx>
Parameter environment for the item we are in.
effective_visibilities: &'tcx EffectiveVisibilities
Items accessible from the crate being checked.
last_node_with_lint_attrs: HirId
§generics: Option<&'tcx Generics<'tcx>>
Generic type parameters in scope for the item we are in.
only_module: bool
We are only looking at one module
Implementations§
source§impl<'tcx> LateContext<'tcx>
impl<'tcx> LateContext<'tcx>
sourcepub fn maybe_typeck_results(&self) -> Option<&'tcx TypeckResults<'tcx>>
pub fn maybe_typeck_results(&self) -> Option<&'tcx TypeckResults<'tcx>>
Gets the type-checking results for the current body,
or None
if outside a body.
sourcepub fn typeck_results(&self) -> &'tcx TypeckResults<'tcx>
pub fn typeck_results(&self) -> &'tcx TypeckResults<'tcx>
Gets the type-checking results for the current body.
As this will ICE if called outside bodies, only call when working with
Expr
or Pat
nodes (they are guaranteed to be found only in bodies).
sourcepub fn qpath_res(&self, qpath: &QPath<'_>, id: HirId) -> Res
pub fn qpath_res(&self, qpath: &QPath<'_>, id: HirId) -> Res
Returns the final resolution of a QPath
, or Res::Err
if unavailable.
Unlike .typeck_results().qpath_res(qpath, id)
, this can be used even outside
bodies (e.g. for paths in hir::Ty
), without any risk of ICE-ing.
sourcepub fn match_def_path(&self, def_id: DefId, path: &[Symbol]) -> bool
pub fn match_def_path(&self, def_id: DefId, path: &[Symbol]) -> bool
Check if a DefId
’s path matches the given absolute type path usage.
Anonymous scopes such as extern
imports are matched with kw::Empty
;
inherent impl
blocks are matched with the name of the type.
Instead of using this method, it is often preferable to instead use
rustc_diagnostic_item
or a lang_item
. This is less prone to errors
as paths get invalidated if the target definition moves.
§Examples
if cx.match_def_path(def_id, &[sym::core, sym::option, sym::Option]) {
// The given `def_id` is that of an `Option` type
}
Used by clippy, but should be replaced by diagnostic items eventually.
sourcepub fn get_def_path(&self, def_id: DefId) -> Vec<Symbol>
pub fn get_def_path(&self, def_id: DefId) -> Vec<Symbol>
sourcepub fn get_associated_type(
&self,
self_ty: Ty<'tcx>,
trait_id: DefId,
name: &str,
) -> Option<Ty<'tcx>>
pub fn get_associated_type( &self, self_ty: Ty<'tcx>, trait_id: DefId, name: &str, ) -> Option<Ty<'tcx>>
Returns the associated type name
for self_ty
as an implementation of trait_id
.
Do not invoke without first verifying that the type implements the trait.
sourcepub fn expr_or_init<'a>(&self, expr: &'a Expr<'tcx>) -> &'a Expr<'tcx>
pub fn expr_or_init<'a>(&self, expr: &'a Expr<'tcx>) -> &'a Expr<'tcx>
If the given expression is a local binding, find the initializer expression. If that initializer expression is another local binding, find its initializer again.
This process repeats as long as possible (but usually no more than once). Type-check adjustments are not taken in account in this function.
Examples:
let abc = 1;
let def = abc + 2;
// ^^^^^^^ output
let def = def;
dbg!(def);
// ^^^ input
sourcepub fn expr_or_init_with_outside_body<'a>(
&self,
expr: &'a Expr<'tcx>,
) -> &'a Expr<'tcx>
pub fn expr_or_init_with_outside_body<'a>( &self, expr: &'a Expr<'tcx>, ) -> &'a Expr<'tcx>
If the given expression is a local binding, find the initializer expression.
If that initializer expression is another local or outside (const
/static
)
binding, find its initializer again.
This process repeats as long as possible (but usually no more than once). Type-check adjustments are not taken in account in this function.
Examples:
const ABC: i32 = 1;
// ^ output
let def = ABC;
dbg!(def);
// ^^^ input
// or...
let abc = 1;
let def = abc + 2;
// ^^^^^^^ output
dbg!(def);
// ^^^ input
Trait Implementations§
source§impl<'tcx> HasDataLayout for LateContext<'tcx>
impl<'tcx> HasDataLayout for LateContext<'tcx>
fn data_layout(&self) -> &TargetDataLayout
source§impl<'tcx> HasParamEnv<'tcx> for LateContext<'tcx>
impl<'tcx> HasParamEnv<'tcx> for LateContext<'tcx>
source§impl<'tcx> LayoutOfHelpers<'tcx> for LateContext<'tcx>
impl<'tcx> LayoutOfHelpers<'tcx> for LateContext<'tcx>
source§type LayoutOfResult = Result<TyAndLayout<'tcx, Ty<'tcx>>, LayoutError<'tcx>>
type LayoutOfResult = Result<TyAndLayout<'tcx, Ty<'tcx>>, LayoutError<'tcx>>
TyAndLayout
-wrapping type (or TyAndLayout
itself), which will be
returned from layout_of
(see also handle_layout_err
).source§fn handle_layout_err(
&self,
err: LayoutError<'tcx>,
_: Span,
_: Ty<'tcx>,
) -> LayoutError<'tcx>
fn handle_layout_err( &self, err: LayoutError<'tcx>, _: Span, _: Ty<'tcx>, ) -> LayoutError<'tcx>
layout_of
, to adapt tcx.layout_of(...)
into a
Self::LayoutOfResult
(which does not need to be a Result<...>
). Read moresource§fn layout_tcx_at_span(&self) -> Span
fn layout_tcx_at_span(&self) -> Span
Span
to use for tcx.at(span)
, from layout_of
.source§impl<'tcx> LintContext for LateContext<'tcx>
impl<'tcx> LintContext for LateContext<'tcx>
source§fn opt_span_lint<S: Into<MultiSpan>>(
&self,
lint: &'static Lint,
span: Option<S>,
decorate: impl for<'a, 'b> FnOnce(&'b mut Diag<'a, ()>),
)
fn opt_span_lint<S: Into<MultiSpan>>( &self, lint: &'static Lint, span: Option<S>, decorate: impl for<'a, 'b> FnOnce(&'b mut Diag<'a, ()>), )
source§fn get_lint_level(&self, lint: &'static Lint) -> Level
fn get_lint_level(&self, lint: &'static Lint) -> Level
source§fn emit_span_lint<S: Into<MultiSpan>>(
&self,
lint: &'static Lint,
span: S,
decorator: impl for<'a> LintDiagnostic<'a, ()>,
)
fn emit_span_lint<S: Into<MultiSpan>>( &self, lint: &'static Lint, span: S, decorator: impl for<'a> LintDiagnostic<'a, ()>, )
span
from a lint struct (some type that implements LintDiagnostic
,
typically generated by #[derive(LintDiagnostic)]
).source§fn span_lint<S: Into<MultiSpan>>(
&self,
lint: &'static Lint,
span: S,
decorate: impl for<'a, 'b> FnOnce(&'b mut Diag<'a, ()>),
)
fn span_lint<S: Into<MultiSpan>>( &self, lint: &'static Lint, span: S, decorate: impl for<'a, 'b> FnOnce(&'b mut Diag<'a, ()>), )
source§fn emit_lint(
&self,
lint: &'static Lint,
decorator: impl for<'a> LintDiagnostic<'a, ()>,
)
fn emit_lint( &self, lint: &'static Lint, decorator: impl for<'a> LintDiagnostic<'a, ()>, )
LintDiagnostic
, typically
generated by #[derive(LintDiagnostic)]
).source§fn lint(
&self,
lint: &'static Lint,
decorate: impl for<'a, 'b> FnOnce(&'b mut Diag<'a, ()>),
)
fn lint( &self, lint: &'static Lint, decorate: impl for<'a, 'b> FnOnce(&'b mut Diag<'a, ()>), )
source§fn fulfill_expectation(&self, expectation: LintExpectationId)
fn fulfill_expectation(&self, expectation: LintExpectationId)
Auto Trait Implementations§
impl<'tcx> !Freeze for LateContext<'tcx>
impl<'tcx> !RefUnwindSafe for LateContext<'tcx>
impl<'tcx> !Send for LateContext<'tcx>
impl<'tcx> !Sync for LateContext<'tcx>
impl<'tcx> Unpin for LateContext<'tcx>
impl<'tcx> !UnwindSafe for LateContext<'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, 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<'tcx, C> LayoutOf<'tcx> for Cwhere
C: LayoutOfHelpers<'tcx>,
impl<'tcx, C> LayoutOf<'tcx> for Cwhere
C: LayoutOfHelpers<'tcx>,
source§fn layout_of(&self, ty: Ty<'tcx>) -> Self::LayoutOfResult
fn layout_of(&self, ty: Ty<'tcx>) -> Self::LayoutOfResult
source§fn spanned_layout_of(&self, ty: Ty<'tcx>, span: Span) -> Self::LayoutOfResult
fn spanned_layout_of(&self, ty: Ty<'tcx>, span: Span) -> Self::LayoutOfResult
span
. Note that this implicitly
executes in “reveal all” mode, and will normalize the input type.source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
source§impl<T> PointerArithmetic for Twhere
T: HasDataLayout,
impl<T> PointerArithmetic for Twhere
T: HasDataLayout,
fn pointer_size(&self) -> Size
fn max_size_of_val(&self) -> Size
fn target_usize_max(&self) -> u64
fn target_isize_min(&self) -> i64
fn target_isize_max(&self) -> i64
fn truncate_to_target_usize(&self, val: u64) -> u64
fn sign_extend_to_target_isize(&self, val: u64) -> i64
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<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for 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: 64 bytes