From d7546d8c2323adff53c8170c528e82a8131681c5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lauren=C8=9Biu=20Nicola?= <lnicola@dend.ro>
Date: Mon, 5 Apr 2021 17:38:37 +0300
Subject: Pass interner to TraitRef::self_type_parameter

---
 crates/hir_ty/src/display.rs              | 31 ++++++++++++++++---------------
 crates/hir_ty/src/lib.rs                  |  8 +++++---
 crates/hir_ty/src/lower.rs                |  3 ++-
 crates/hir_ty/src/traits/chalk/mapping.rs |  2 +-
 4 files changed, 24 insertions(+), 20 deletions(-)

(limited to 'crates/hir_ty')

diff --git a/crates/hir_ty/src/display.rs b/crates/hir_ty/src/display.rs
index 965476a05..1108e5a10 100644
--- a/crates/hir_ty/src/display.rs
+++ b/crates/hir_ty/src/display.rs
@@ -592,20 +592,21 @@ impl HirDisplay for Ty {
                     }
                     TypeParamProvenance::ArgumentImplTrait => {
                         let substs = generics.type_params_subst(f.db);
-                        let bounds = f
-                            .db
-                            .generic_predicates(id.parent)
-                            .into_iter()
-                            .map(|pred| pred.clone().subst(&substs))
-                            .filter(|wc| match &wc.skip_binders() {
-                                WhereClause::Implemented(tr) => tr.self_type_parameter() == self,
-                                WhereClause::AliasEq(AliasEq {
-                                    alias: AliasTy::Projection(proj),
-                                    ty: _,
-                                }) => proj.self_type_parameter(&Interner) == self,
-                                _ => false,
-                            })
-                            .collect::<Vec<_>>();
+                        let bounds =
+                            f.db.generic_predicates(id.parent)
+                                .into_iter()
+                                .map(|pred| pred.clone().subst(&substs))
+                                .filter(|wc| match &wc.skip_binders() {
+                                    WhereClause::Implemented(tr) => {
+                                        tr.self_type_parameter(&Interner) == self
+                                    }
+                                    WhereClause::AliasEq(AliasEq {
+                                        alias: AliasTy::Projection(proj),
+                                        ty: _,
+                                    }) => proj.self_type_parameter(&Interner) == self,
+                                    _ => false,
+                                })
+                                .collect::<Vec<_>>();
                         write_bounds_like_dyn_trait_with_prefix("impl", &bounds, f)?;
                     }
                 }
@@ -780,7 +781,7 @@ impl TraitRef {
             return write!(f, "{}", TYPE_HINT_TRUNCATION);
         }
 
-        self.self_type_parameter().hir_fmt(f)?;
+        self.self_type_parameter(&Interner).hir_fmt(f)?;
         if use_as {
             write!(f, " as ")?;
         } else {
diff --git a/crates/hir_ty/src/lib.rs b/crates/hir_ty/src/lib.rs
index 80dd7aaca..adfdcaa37 100644
--- a/crates/hir_ty/src/lib.rs
+++ b/crates/hir_ty/src/lib.rs
@@ -165,8 +165,8 @@ impl<T: TypeWalk> Binders<T> {
 }
 
 impl TraitRef {
-    pub fn self_type_parameter(&self) -> &Ty {
-        &self.substitution.at(&Interner, 0).assert_ty_ref(&Interner)
+    pub fn self_type_parameter(&self, interner: &Interner) -> &Ty {
+        &self.substitution.at(interner, 0).assert_ty_ref(interner)
     }
 
     pub fn hir_trait_id(&self) -> TraitId {
@@ -473,7 +473,9 @@ impl Ty {
                             .into_iter()
                             .map(|pred| pred.clone().subst(&substs))
                             .filter(|wc| match &wc.skip_binders() {
-                                WhereClause::Implemented(tr) => tr.self_type_parameter() == self,
+                                WhereClause::Implemented(tr) => {
+                                    tr.self_type_parameter(&Interner) == self
+                                }
                                 WhereClause::AliasEq(AliasEq {
                                     alias: AliasTy::Projection(proj),
                                     ty: _,
diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs
index ba48be4ad..e9e4e69ad 100644
--- a/crates/hir_ty/src/lower.rs
+++ b/crates/hir_ty/src/lower.rs
@@ -941,7 +941,8 @@ pub(crate) fn trait_environment_query(
     for pred in resolver.where_predicates_in_scope() {
         for pred in ctx.lower_where_predicate(pred, false) {
             if let WhereClause::Implemented(tr) = &pred.skip_binders() {
-                traits_in_scope.push((tr.self_type_parameter().clone(), tr.hir_trait_id()));
+                traits_in_scope
+                    .push((tr.self_type_parameter(&Interner).clone(), tr.hir_trait_id()));
             }
             let program_clause: chalk_ir::ProgramClause<Interner> =
                 pred.clone().to_chalk(db).cast(&Interner);
diff --git a/crates/hir_ty/src/traits/chalk/mapping.rs b/crates/hir_ty/src/traits/chalk/mapping.rs
index 240f9d456..67e88ebf4 100644
--- a/crates/hir_ty/src/traits/chalk/mapping.rs
+++ b/crates/hir_ty/src/traits/chalk/mapping.rs
@@ -539,7 +539,7 @@ pub(super) fn generic_predicate_to_inline_bound(
     let self_ty_shifted_in = self_ty.clone().shift_bound_vars(DebruijnIndex::ONE);
     match &pred.value {
         WhereClause::Implemented(trait_ref) => {
-            if trait_ref.self_type_parameter() != &self_ty_shifted_in {
+            if trait_ref.self_type_parameter(&Interner) != &self_ty_shifted_in {
                 // we can only convert predicates back to type bounds if they
                 // have the expected self type
                 return None;
-- 
cgit v1.2.3