]> git.lizzy.rs Git - rust.git/commitdiff
Use QuantifiedWhereClause in generic_predicates as well
authorFlorian Diebold <flodiebold@gmail.com>
Sun, 21 Mar 2021 16:40:14 +0000 (17:40 +0100)
committerFlorian Diebold <flodiebold@gmail.com>
Sun, 21 Mar 2021 17:01:14 +0000 (18:01 +0100)
Still far too much binder skipping going on; I find it hard to imagine
this is all correct, but the tests pass.

crates/hir/src/display.rs
crates/hir/src/lib.rs
crates/hir_ty/src/db.rs
crates/hir_ty/src/display.rs
crates/hir_ty/src/infer/expr.rs
crates/hir_ty/src/lib.rs
crates/hir_ty/src/lower.rs
crates/hir_ty/src/traits/chalk/mapping.rs
crates/hir_ty/src/utils.rs

index c96ebb50a93ebfb7c6a529046802c2d65bedaeea..9f6d7be48393a6c1e8e375d71383011b6e3ef5d9 100644 (file)
@@ -236,11 +236,7 @@ fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
         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)?;
         }
index 1844942a6ca6f7717ed3a9cad75712e41c4b0f89..a325b6691a0023c48e63b54e3f7132716e88c854 100644 (file)
@@ -1460,7 +1460,7 @@ pub fn ty(self, db: &dyn HirDatabase) -> Type {
     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()))
                 }
index 91a2e0b5be92e7a11b0fcf7969c27ac1eb49e257..58e4247c6ae7c824ebabbf019aa5a3da933fb17a 100644 (file)
@@ -12,8 +12,8 @@
 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;
 
@@ -57,10 +57,13 @@ fn return_type_impl_traits(
 
     #[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>;
index 3726714057c541c8e901f2e11ccc4edf0c43a805..cc6b93d37ad92da1b4c8990ec2f70c5f3e3c9f85 100644 (file)
@@ -581,7 +581,7 @@ fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
                             .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),
@@ -590,15 +590,7 @@ fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
                                 _ => 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)?;
                     }
                 }
             }
index 79bbc5dabaaba7567a7c355925251195b08fcc0e..17849d552886a4f1e1e4e1ae6f8255cf9eee3cdc 100644 (file)
@@ -11,6 +11,7 @@
     AssocContainerId, FieldId, Lookup,
 };
 use hir_expand::name::{name, Name};
+use stdx::always;
 use syntax::ast::RangeOp;
 
 use crate::{
@@ -936,7 +937,9 @@ fn register_obligations_for_call(&mut self, callable_ty: &Ty) {
             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
index e4b1f92e42af88d8e10b65481783fc9dc4943c70..90b5b17e2a411fbfdd86b906ab5a0cf918fd74f2 100644 (file)
@@ -518,6 +518,10 @@ pub fn filter_map<U>(self, f: impl FnOnce(T) -> Option<U>) -> Option<Binders<U>>
     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> {
@@ -985,7 +989,7 @@ pub fn impl_trait_bounds(&self, db: &dyn HirDatabase) -> Option<Vec<QuantifiedWh
                             .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),
@@ -993,7 +997,6 @@ pub fn impl_trait_bounds(&self, db: &dyn HirDatabase) -> Option<Vec<QuantifiedWh
                                 }) => proj.self_type_parameter() == self,
                                 _ => false,
                             })
-                            .map(Binders::wrap_empty)
                             .collect_vec();
 
                         Some(predicates)
index 45591e92026ba768747408308c8f14c226980ee6..f60cec649b4104c4cac1aede64db65d251526b62 100644 (file)
@@ -825,7 +825,7 @@ pub fn associated_type_shorthand_candidates<R>(
             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,
                 })
@@ -898,10 +898,7 @@ pub(crate) fn field_types_query(
 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);
@@ -920,7 +917,7 @@ pub(crate) fn generic_predicates_for_param_query(
             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()
 }
@@ -929,7 +926,7 @@ pub(crate) fn generic_predicates_for_param_recover(
     _db: &dyn HirDatabase,
     _cycle: &[String],
     _param_id: &TypeParamId,
-) -> Arc<[Binders<WhereClause>]> {
+) -> Arc<[Binders<QuantifiedWhereClause>]> {
     Arc::new([])
 }
 
@@ -984,10 +981,7 @@ pub(crate) fn trait_environment_query(
 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);
@@ -995,7 +989,7 @@ pub(crate) fn generic_predicates_query(
     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()
 }
index 5b9c7e831f8150d9d3323726e122550aabeae3b6..7209dd14ec9e555cd62f7dae239a0754686539ad 100644 (file)
@@ -537,7 +537,7 @@ pub(super) fn convert_where_clauses(
     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
 }
index 1ec1ecd43285124d2f431ce2cfeabf2866f19597..19874e42b130d0171edf0fd94ffc4101ee65774d 100644 (file)
@@ -63,7 +63,7 @@ fn direct_super_trait_refs(db: &dyn HirDatabase, trait_ref: &TraitRef) -> Vec<Tr
     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,
             })