Skip to main content

QueryTypeOp

Trait QueryTypeOp 

Source
pub trait QueryTypeOp<'tcx>:
    Debug
    + Copy
    + TypeFoldable<TyCtxt<'tcx>>
    + 'tcx {
    type QueryResponse: TypeFoldable<TyCtxt<'tcx>>;

    // Required methods
    fn try_fast_path(
        tcx: TyCtxt<'tcx>,
        key: &ParamEnvAnd<'tcx, Self>,
    ) -> Option<Self::QueryResponse>;
    fn perform_query(
        tcx: TyCtxt<'tcx>,
        canonicalized: CanonicalQueryInput<'tcx, ParamEnvAnd<'tcx, Self>>,
    ) -> Result<CanonicalQueryResponse<'tcx, Self::QueryResponse>, NoSolution>;

    // Provided method
    fn fully_perform_into(
        query_key: ParamEnvAnd<'tcx, Self>,
        infcx: &InferCtxt<'tcx>,
        output_query_region_constraints: &mut QueryRegionConstraints<'tcx>,
        span: Span,
    ) -> Result<(Self::QueryResponse, Option<CanonicalQueryInput<'tcx, ParamEnvAnd<'tcx, Self>>>, PredicateObligations<'tcx>, Certainty), NoSolution> { ... }
}
Expand description

“Query type ops” are type ops that are implemented using a canonical query. The Self type here contains the kernel of information needed to do the operation – TypeOp is actually implemented for ParamEnvAnd<Self>, since we always need to bring along a parameter environment as well. For query type-ops, we will first canonicalize the key and then invoke the query on the tcx, which produces the resulting query region constraints.

Required Associated Types§

Required Methods§

Source

fn try_fast_path( tcx: TyCtxt<'tcx>, key: &ParamEnvAnd<'tcx, Self>, ) -> Option<Self::QueryResponse>

Give query the option for a simple fast path that never actually hits the tcx cache lookup etc. Return Some(r) with a final result or None to do the full path.

Source

fn perform_query( tcx: TyCtxt<'tcx>, canonicalized: CanonicalQueryInput<'tcx, ParamEnvAnd<'tcx, Self>>, ) -> Result<CanonicalQueryResponse<'tcx, Self::QueryResponse>, NoSolution>

Performs the actual query with the canonicalized key – the real work happens here. This method is not given an infcx because it shouldn’t need one – and if it had access to one, it might do things like invoke sub_regions, which would be bad, because it would create subregion relationships that are not captured in the return value.

Provided Methods§

Source

fn fully_perform_into( query_key: ParamEnvAnd<'tcx, Self>, infcx: &InferCtxt<'tcx>, output_query_region_constraints: &mut QueryRegionConstraints<'tcx>, span: Span, ) -> Result<(Self::QueryResponse, Option<CanonicalQueryInput<'tcx, ParamEnvAnd<'tcx, Self>>>, PredicateObligations<'tcx>, Certainty), NoSolution>

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§

Source§

impl<'tcx, T> QueryTypeOp<'tcx> for Normalize<'tcx, T>
where T: Normalizable<'tcx> + 'tcx,

Source§

impl<'tcx> QueryTypeOp<'tcx> for AscribeUserType<'tcx>

Source§

impl<'tcx> QueryTypeOp<'tcx> for DropckOutlives<'tcx>

Source§

impl<'tcx> QueryTypeOp<'tcx> for ImpliedOutlivesBounds<'tcx>

Source§

impl<'tcx> QueryTypeOp<'tcx> for ProvePredicate<'tcx>