write!(f, "{}", self.name(f.db))?;
let bounds = f.db.generic_predicates_for_param(self.id);
let substs = Substitution::type_params(f.db, self.id.parent);
- let predicates = bounds
- .iter()
- .cloned()
- .map(|b| hir_ty::Binders::new(0, b.subst(&substs)))
- .collect::<Vec<_>>();
+ let predicates = bounds.iter().cloned().map(|b| b.subst(&substs)).collect::<Vec<_>>();
if !(predicates.is_empty() || f.omit_verbose_types()) {
write_bounds_like_dyn_trait_with_prefix(":", &predicates, f)?;
}
pub fn trait_bounds(self, db: &dyn HirDatabase) -> Vec<Trait> {
db.generic_predicates_for_param(self.id)
.into_iter()
- .filter_map(|pred| match &pred.value {
+ .filter_map(|pred| match &pred.skip_binders().skip_binders() {
hir_ty::WhereClause::Implemented(trait_ref) => {
Some(Trait::from(trait_ref.hir_trait_id()))
}
use crate::{
method_resolution::{InherentImpls, TraitImpls},
traits::chalk,
- Binders, CallableDefId, FnDefId, ImplTraitId, InferenceResult, PolyFnSig, ReturnTypeImplTraits,
- TraitRef, Ty, TyDefId, ValueTyDefId, WhereClause,
+ Binders, CallableDefId, FnDefId, ImplTraitId, InferenceResult, PolyFnSig,
+ QuantifiedWhereClause, ReturnTypeImplTraits, TraitRef, Ty, TyDefId, ValueTyDefId,
};
use hir_expand::name::Name;
#[salsa::invoke(crate::lower::generic_predicates_for_param_query)]
#[salsa::cycle(crate::lower::generic_predicates_for_param_recover)]
- fn generic_predicates_for_param(&self, param_id: TypeParamId) -> Arc<[Binders<WhereClause>]>;
+ fn generic_predicates_for_param(
+ &self,
+ param_id: TypeParamId,
+ ) -> Arc<[Binders<QuantifiedWhereClause>]>;
#[salsa::invoke(crate::lower::generic_predicates_query)]
- fn generic_predicates(&self, def: GenericDefId) -> Arc<[Binders<WhereClause>]>;
+ fn generic_predicates(&self, def: GenericDefId) -> Arc<[Binders<QuantifiedWhereClause>]>;
#[salsa::invoke(crate::lower::trait_environment_query)]
fn trait_environment(&self, def: GenericDefId) -> Arc<crate::TraitEnvironment>;
.generic_predicates(id.parent)
.into_iter()
.map(|pred| pred.clone().subst(&substs))
- .filter(|wc| match &wc {
+ .filter(|wc| match &wc.skip_binders() {
WhereClause::Implemented(tr) => tr.self_type_parameter() == self,
WhereClause::AliasEq(AliasEq {
alias: AliasTy::Projection(proj),
_ => false,
})
.collect::<Vec<_>>();
- write_bounds_like_dyn_trait_with_prefix(
- "impl",
- &bounds
- .iter()
- .cloned()
- .map(crate::Binders::wrap_empty)
- .collect::<Vec<_>>(),
- f,
- )?;
+ write_bounds_like_dyn_trait_with_prefix("impl", &bounds, f)?;
}
}
}
AssocContainerId, FieldId, Lookup,
};
use hir_expand::name::{name, Name};
+use stdx::always;
use syntax::ast::RangeOp;
use crate::{
let def: CallableDefId = from_chalk(self.db, *fn_def);
let generic_predicates = self.db.generic_predicates(def.into());
for predicate in generic_predicates.iter() {
- let predicate = predicate.clone().subst(parameters);
+ let (predicate, binders) =
+ predicate.clone().subst(parameters).into_value_and_skipped_binders();
+ always!(binders == 0); // quantified where clauses not yet handled
self.obligations.push(predicate.cast(&Interner));
}
// add obligation for trait implementation, if this is a trait method
pub fn skip_binders(&self) -> &T {
&self.value
}
+
+ pub fn into_value_and_skipped_binders(self) -> (T, usize) {
+ (self.value, self.num_binders)
+ }
}
impl<T: Clone> Binders<&T> {
.generic_predicates(id.parent)
.into_iter()
.map(|pred| pred.clone().subst(&substs))
- .filter(|wc| match &wc {
+ .filter(|wc| match &wc.skip_binders() {
WhereClause::Implemented(tr) => tr.self_type_parameter() == self,
WhereClause::AliasEq(AliasEq {
alias: AliasTy::Projection(proj),
}) => proj.self_type_parameter() == self,
_ => false,
})
- .map(Binders::wrap_empty)
.collect_vec();
Some(predicates)
let predicates = db.generic_predicates_for_param(param_id);
let mut traits_: Vec<_> = predicates
.iter()
- .filter_map(|pred| match &pred.value {
+ .filter_map(|pred| match &pred.value.value {
WhereClause::Implemented(tr) => Some(tr.clone()),
_ => None,
})
pub(crate) fn generic_predicates_for_param_query(
db: &dyn HirDatabase,
param_id: TypeParamId,
-) -> Arc<[Binders<WhereClause>]> {
- // FIXME: these binders are for the type parameters of the def. We need to
- // introduce another level of binders for quantified where clauses (for<'a>
- // ...)
+) -> Arc<[Binders<QuantifiedWhereClause>]> {
let resolver = param_id.parent.resolver(db.upcast());
let ctx =
TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable);
WherePredicate::Lifetime { .. } => false,
})
.flat_map(|pred| {
- ctx.lower_where_predicate(pred, true).map(|p| Binders::new(generics.len(), p.value))
+ ctx.lower_where_predicate(pred, true).map(|p| Binders::new(generics.len(), p))
})
.collect()
}
_db: &dyn HirDatabase,
_cycle: &[String],
_param_id: &TypeParamId,
-) -> Arc<[Binders<WhereClause>]> {
+) -> Arc<[Binders<QuantifiedWhereClause>]> {
Arc::new([])
}
pub(crate) fn generic_predicates_query(
db: &dyn HirDatabase,
def: GenericDefId,
-) -> Arc<[Binders<WhereClause>]> {
- // FIXME: these binders are for the type parameters of the def. We need to
- // introduce another level of binders for quantified where clauses (for<'a>
- // ...)
+) -> Arc<[Binders<QuantifiedWhereClause>]> {
let resolver = def.resolver(db.upcast());
let ctx =
TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable);
resolver
.where_predicates_in_scope()
.flat_map(|pred| {
- ctx.lower_where_predicate(pred, false).map(|p| Binders::new(generics.len(), p.value))
+ ctx.lower_where_predicate(pred, false).map(|p| Binders::new(generics.len(), p))
})
.collect()
}
let generic_predicates = db.generic_predicates(def);
let mut result = Vec::with_capacity(generic_predicates.len());
for pred in generic_predicates.iter() {
- result.push(crate::Binders::wrap_empty(pred.clone().subst(substs)).to_chalk(db));
+ result.push(pred.clone().subst(substs).to_chalk(db));
}
result
}
db.generic_predicates_for_param(trait_self)
.iter()
.filter_map(|pred| {
- pred.as_ref().filter_map(|pred| match pred {
+ pred.as_ref().filter_map(|pred| match pred.skip_binders() {
WhereClause::Implemented(tr) => Some(tr.clone()),
_ => None,
})