pub struct PredicateSearcher<'tcx> {
tcx: TyCtxt<'tcx>,
typing_env: TypingEnv<'tcx>,
candidates: HashMap<PolyTraitPredicate<'tcx>, Candidate<'tcx>>,
options: BoundsOptions,
bound_clause_count: usize,
}Expand description
Stores a set of predicates along with where they came from.
Fields§
§tcx: TyCtxt<'tcx>§typing_env: TypingEnv<'tcx>§candidates: HashMap<PolyTraitPredicate<'tcx>, Candidate<'tcx>>Local clauses available in the current context.
options: BoundsOptionsResolution options.
bound_clause_count: usizeCount the number of bound clauses in scope; used to identify clauses uniquely.
Implementations§
Source§impl<'tcx> PredicateSearcher<'tcx>
impl<'tcx> PredicateSearcher<'tcx>
Sourcepub fn new_for_owner(
tcx: TyCtxt<'tcx>,
owner_id: DefId,
options: BoundsOptions,
) -> Self
pub fn new_for_owner( tcx: TyCtxt<'tcx>, owner_id: DefId, options: BoundsOptions, ) -> Self
Initialize the elaborator with the predicates accessible within this item.
Sourcepub fn insert_bound_predicates(
&mut self,
clauses: impl IntoIterator<Item = PolyTraitPredicate<'tcx>>,
)
pub fn insert_bound_predicates( &mut self, clauses: impl IntoIterator<Item = PolyTraitPredicate<'tcx>>, )
Insert the bound clauses in the search context. Prefer inserting them all at once as this
will give priority to shorter resolution paths. Bound clauses are numbered from 0 in
insertion order.
Sourcepub fn set_param_env(&mut self, param_env: ParamEnv<'tcx>)
pub fn set_param_env(&mut self, param_env: ParamEnv<'tcx>)
Override the param env; we use this when resolving dyn predicates to add more clauses to
the scope.
Sourcefn insert_predicates(
&mut self,
preds: impl IntoIterator<Item = AnnotatedTraitPred<'tcx>>,
)
fn insert_predicates( &mut self, preds: impl IntoIterator<Item = AnnotatedTraitPred<'tcx>>, )
Insert annotated predicates in the search context. Prefer inserting them all at once as this will give priority to shorter resolution paths.
Sourcefn insert_candidates(
&mut self,
candidates: impl IntoIterator<Item = Candidate<'tcx>>,
)
fn insert_candidates( &mut self, candidates: impl IntoIterator<Item = Candidate<'tcx>>, )
Insert new candidates and all their parent predicates. This deduplicates predicates to avoid divergence.
Sourcefn insert_candidate_parents(&mut self, new_candidates: Vec<Candidate<'tcx>>)
fn insert_candidate_parents(&mut self, new_candidates: Vec<Candidate<'tcx>>)
Add the parents of these candidates. This is a separate function to avoid polymorphic recursion due to the closures capturing the type parameters of this function.
Sourcefn add_associated_type_refs(
&mut self,
ty: Binder<'tcx, Ty<'tcx>>,
warn: &impl Fn(&str),
) -> Result<(), String>
fn add_associated_type_refs( &mut self, ty: Binder<'tcx, Ty<'tcx>>, warn: &impl Fn(&str), ) -> Result<(), String>
If the type is a trait associated type, we add any relevant bounds to our context.
Sourcefn resolve_local(
&mut self,
target: PolyTraitPredicate<'tcx>,
warn: &impl Fn(&str),
) -> Result<Option<Candidate<'tcx>>, String>
fn resolve_local( &mut self, target: PolyTraitPredicate<'tcx>, warn: &impl Fn(&str), ) -> Result<Option<Candidate<'tcx>>, String>
Resolve a local clause by looking it up in this set. If the predicate applies to an associated type, we add the relevant implied associated type bounds to the set as well.
Sourcepub fn resolve(
&mut self,
tref: &PolyTraitRef<'tcx>,
warn: &impl Fn(&str),
) -> Result<ImplExpr<'tcx>, String>
pub fn resolve( &mut self, tref: &PolyTraitRef<'tcx>, warn: &impl Fn(&str), ) -> Result<ImplExpr<'tcx>, String>
Resolve the given trait reference in the local context.
Sourcepub fn resolve_item_required_predicates(
&mut self,
def_id: DefId,
generics: GenericArgsRef<'tcx>,
warn: &impl Fn(&str),
) -> Result<Vec<ImplExpr<'tcx>>, String>
pub fn resolve_item_required_predicates( &mut self, def_id: DefId, generics: GenericArgsRef<'tcx>, warn: &impl Fn(&str), ) -> Result<Vec<ImplExpr<'tcx>>, String>
Resolve the predicates required by the given item.
Sourcepub fn resolve_item_implied_predicates(
&mut self,
def_id: DefId,
generics: GenericArgsRef<'tcx>,
warn: &impl Fn(&str),
) -> Result<Vec<ImplExpr<'tcx>>, String>
pub fn resolve_item_implied_predicates( &mut self, def_id: DefId, generics: GenericArgsRef<'tcx>, warn: &impl Fn(&str), ) -> Result<Vec<ImplExpr<'tcx>>, String>
Resolve the predicates implied by the given item.
Sourcepub fn resolve_predicates(
&mut self,
generics: GenericArgsRef<'tcx>,
predicates: Predicates<'tcx>,
warn: &impl Fn(&str),
) -> Result<Vec<ImplExpr<'tcx>>, String>
pub fn resolve_predicates( &mut self, generics: GenericArgsRef<'tcx>, predicates: Predicates<'tcx>, warn: &impl Fn(&str), ) -> Result<Vec<ImplExpr<'tcx>>, String>
Apply the given generics to the provided clauses and resolve the trait references in the current context.
Trait Implementations§
Source§impl<'tcx> Clone for PredicateSearcher<'tcx>
impl<'tcx> Clone for PredicateSearcher<'tcx>
Source§fn clone(&self) -> PredicateSearcher<'tcx>
fn clone(&self) -> PredicateSearcher<'tcx>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl<'tcx> Freeze for PredicateSearcher<'tcx>
impl<'tcx> !RefUnwindSafe for PredicateSearcher<'tcx>
impl<'tcx> !Send for PredicateSearcher<'tcx>
impl<'tcx> !Sync for PredicateSearcher<'tcx>
impl<'tcx> Unpin for PredicateSearcher<'tcx>
impl<'tcx> !UnwindSafe for PredicateSearcher<'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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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 more