Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/method_resolution.rs')
-rw-r--r--crates/hir-ty/src/method_resolution.rs48
1 files changed, 26 insertions, 22 deletions
diff --git a/crates/hir-ty/src/method_resolution.rs b/crates/hir-ty/src/method_resolution.rs
index 9a6adedb99..a5ec2a3fec 100644
--- a/crates/hir-ty/src/method_resolution.rs
+++ b/crates/hir-ty/src/method_resolution.rs
@@ -32,13 +32,13 @@ use stdx::impl_from;
use triomphe::Arc;
use crate::{
- TraitEnvironment, all_super_traits,
+ all_super_traits,
db::HirDatabase,
infer::{InferenceContext, unify::InferenceTable},
lower::GenericPredicates,
next_solver::{
- Binder, ClauseKind, DbInterner, FnSig, GenericArgs, PredicateKind, SimplifiedType,
- SolverDefId, TraitRef, Ty, TyKind, TypingMode,
+ Binder, ClauseKind, DbInterner, FnSig, GenericArgs, ParamEnv, PredicateKind,
+ SimplifiedType, SolverDefId, TraitRef, Ty, TyKind, TypingMode,
infer::{
BoundRegionConversionTime, DbInternerInferExt, InferCtxt, InferOk,
select::ImplSource,
@@ -47,6 +47,7 @@ use crate::{
obligation_ctxt::ObligationCtxt,
util::clauses_as_obligations,
},
+ traits::ParamEnvAndCrate,
};
pub use self::probe::{
@@ -75,7 +76,7 @@ impl MethodResolutionUnstableFeatures {
pub struct MethodResolutionContext<'a, 'db> {
pub infcx: &'a InferCtxt<'db>,
pub resolver: &'a Resolver<'db>,
- pub env: &'a TraitEnvironment<'db>,
+ pub param_env: ParamEnv<'db>,
pub traits_in_scope: &'a FxHashSet<TraitId>,
pub edition: Edition,
pub unstable_features: &'a MethodResolutionUnstableFeatures,
@@ -194,7 +195,7 @@ impl<'a, 'db> InferenceContext<'a, 'db> {
let ctx = MethodResolutionContext {
infcx: &self.table.infer_ctxt,
resolver: &self.resolver,
- env: &self.table.trait_env,
+ param_env: self.table.param_env,
traits_in_scope,
edition: self.edition,
unstable_features: &self.unstable_features,
@@ -264,7 +265,7 @@ impl<'db> InferenceTable<'db> {
let obligation = Obligation::new(
self.interner(),
cause,
- self.trait_env.env,
+ self.param_env,
TraitRef::new_from_args(self.interner(), trait_def_id.into(), args),
);
@@ -322,7 +323,7 @@ impl<'db> InferenceTable<'db> {
let bounds = clauses_as_obligations(
bounds.iter_instantiated_copied(interner, args.as_slice()),
ObligationCause::new(),
- self.trait_env.env,
+ self.param_env,
);
obligations.extend(bounds);
@@ -336,7 +337,7 @@ impl<'db> InferenceTable<'db> {
obligations.push(Obligation::new(
interner,
obligation.cause.clone(),
- self.trait_env.env,
+ self.param_env,
Binder::dummy(PredicateKind::Clause(ClauseKind::WellFormed(ty.into()))),
));
}
@@ -350,7 +351,7 @@ impl<'db> InferenceTable<'db> {
pub fn lookup_impl_const<'db>(
infcx: &InferCtxt<'db>,
- env: Arc<TraitEnvironment<'db>>,
+ env: ParamEnv<'db>,
const_id: ConstId,
subs: GenericArgs<'db>,
) -> (ConstId, GenericArgs<'db>) {
@@ -380,7 +381,7 @@ pub fn lookup_impl_const<'db>(
/// call the method using the vtable.
pub fn is_dyn_method<'db>(
interner: DbInterner<'db>,
- _env: Arc<TraitEnvironment<'db>>,
+ _env: ParamEnv<'db>,
func: FunctionId,
fn_subst: GenericArgs<'db>,
) -> Option<usize> {
@@ -415,7 +416,7 @@ pub fn is_dyn_method<'db>(
/// Returns `func` if it's not a method defined in a trait or the lookup failed.
pub(crate) fn lookup_impl_method_query<'db>(
db: &'db dyn HirDatabase,
- env: Arc<TraitEnvironment<'db>>,
+ env: ParamEnvAndCrate<'db>,
func: FunctionId,
fn_subst: GenericArgs<'db>,
) -> (FunctionId, GenericArgs<'db>) {
@@ -433,11 +434,15 @@ pub(crate) fn lookup_impl_method_query<'db>(
);
let name = &db.function_signature(func).name;
- let Some((impl_fn, impl_subst)) =
- lookup_impl_assoc_item_for_trait_ref(&infcx, trait_ref, env, name).and_then(|assoc| {
- if let (AssocItemId::FunctionId(id), subst) = assoc { Some((id, subst)) } else { None }
- })
- else {
+ let Some((impl_fn, impl_subst)) = lookup_impl_assoc_item_for_trait_ref(
+ &infcx,
+ trait_ref,
+ env.param_env,
+ name,
+ )
+ .and_then(|assoc| {
+ if let (AssocItemId::FunctionId(id), subst) = assoc { Some((id, subst)) } else { None }
+ }) else {
return (func, fn_subst);
};
@@ -453,10 +458,10 @@ pub(crate) fn lookup_impl_method_query<'db>(
fn lookup_impl_assoc_item_for_trait_ref<'db>(
infcx: &InferCtxt<'db>,
trait_ref: TraitRef<'db>,
- env: Arc<TraitEnvironment<'db>>,
+ env: ParamEnv<'db>,
name: &Name,
) -> Option<(AssocItemId, GenericArgs<'db>)> {
- let (impl_id, impl_subst) = find_matching_impl(infcx, &env, trait_ref)?;
+ let (impl_id, impl_subst) = find_matching_impl(infcx, env, trait_ref)?;
let item =
impl_id.impl_items(infcx.interner.db).items.iter().find_map(|(n, it)| match *it {
AssocItemId::FunctionId(f) => (n == name).then_some(AssocItemId::FunctionId(f)),
@@ -468,13 +473,12 @@ fn lookup_impl_assoc_item_for_trait_ref<'db>(
pub(crate) fn find_matching_impl<'db>(
infcx: &InferCtxt<'db>,
- env: &TraitEnvironment<'db>,
+ env: ParamEnv<'db>,
trait_ref: TraitRef<'db>,
) -> Option<(ImplId, GenericArgs<'db>)> {
- let trait_ref =
- infcx.at(&ObligationCause::dummy(), env.env).deeply_normalize(trait_ref).ok()?;
+ let trait_ref = infcx.at(&ObligationCause::dummy(), env).deeply_normalize(trait_ref).ok()?;
- let obligation = Obligation::new(infcx.interner, ObligationCause::dummy(), env.env, trait_ref);
+ let obligation = Obligation::new(infcx.interner, ObligationCause::dummy(), env, trait_ref);
let selection = infcx.select(&obligation).ok()??;