about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-04-16 21:13:07 +0000
committerbors <bors@rust-lang.org>2022-04-16 21:13:07 +0000
commit53afd2a707138230dee582fa1d5c3075cab2b6b7 (patch)
tree666068dcf992de3dbd9bede11a31fbd32b0d0483
parentdc6aa056fd5e761b6ab34b72487a5f3ba83bc34a (diff)
parentd26deb5b9facc77d3f786026079e42ff60cad707 (diff)
downloadrust-53afd2a707138230dee582fa1d5c3075cab2b6b7.tar.gz
rust-53afd2a707138230dee582fa1d5c3075cab2b6b7.zip
Auto merge of #12011 - iDawer:completion_detail.impl_trait, r=Veykril
fix: Show `impl Trait` in argument positon in completion details

Follow up for #11991

`hir`: Use `db.callable_item_signature` query more.
-rw-r--r--crates/hir/src/lib.rs38
-rw-r--r--crates/ide_completion/src/tests/expression.rs20
2 files changed, 39 insertions, 19 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 5aa1ca7e0ba..382d1f9a54c 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -1389,15 +1389,15 @@ impl Function {
     }
 
     pub fn assoc_fn_params(self, db: &dyn HirDatabase) -> Vec<Param> {
-        let resolver = self.id.resolver(db.upcast());
-        let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
         let environment = db.trait_environment(self.id.into());
-        db.function_data(self.id)
-            .params
+        let substs = TyBuilder::placeholder_subst(db, self.id);
+        let callable_sig = db.callable_item_signature(self.id.into()).substitute(Interner, &substs);
+        callable_sig
+            .params()
             .iter()
             .enumerate()
-            .map(|(idx, (_, type_ref))| {
-                let ty = Type { env: environment.clone(), ty: ctx.lower_ty(type_ref) };
+            .map(|(idx, ty)| {
+                let ty = Type { env: environment.clone(), ty: ty.clone() };
                 Param { func: self, ty, idx }
             })
             .collect()
@@ -1411,17 +1411,17 @@ impl Function {
     }
 
     pub fn params_without_self(self, db: &dyn HirDatabase) -> Vec<Param> {
-        let resolver = self.id.resolver(db.upcast());
-        let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
         let environment = db.trait_environment(self.id.into());
+        let substs = TyBuilder::placeholder_subst(db, self.id);
+        let callable_sig = db.callable_item_signature(self.id.into()).substitute(Interner, &substs);
         let skip = if db.function_data(self.id).has_self_param() { 1 } else { 0 };
-        db.function_data(self.id)
-            .params
+        callable_sig
+            .params()
             .iter()
             .enumerate()
             .skip(skip)
-            .map(|(idx, (_, type_ref))| {
-                let ty = Type { env: environment.clone(), ty: ctx.lower_ty(type_ref) };
+            .map(|(idx, ty)| {
+                let ty = Type { env: environment.clone(), ty: ty.clone() };
                 Param { func: self, ty, idx }
             })
             .collect()
@@ -1573,11 +1573,12 @@ impl SelfParam {
     }
 
     pub fn ty(&self, db: &dyn HirDatabase) -> Type {
-        let resolver = self.func.resolver(db.upcast());
-        let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
+        let substs = TyBuilder::placeholder_subst(db, self.func);
+        let callable_sig =
+            db.callable_item_signature(self.func.into()).substitute(Interner, &substs);
         let environment = db.trait_environment(self.func.into());
-
-        Type { env: environment, ty: ctx.lower_ty(&db.function_data(self.func).params[0].1) }
+        let ty = callable_sig.params()[0].clone();
+        Type { env: environment, ty }
     }
 }
 
@@ -2576,10 +2577,9 @@ impl Impl {
     }
 
     pub fn self_ty(self, db: &dyn HirDatabase) -> Type {
-        let impl_data = db.impl_data(self.id);
         let resolver = self.id.resolver(db.upcast());
-        let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
-        let ty = ctx.lower_ty(&impl_data.self_ty);
+        let substs = TyBuilder::placeholder_subst(db, self.id);
+        let ty = db.impl_self_ty(self.id).substitute(Interner, &substs);
         Type::new_with_resolver_inner(db, &resolver, ty)
     }
 
diff --git a/crates/ide_completion/src/tests/expression.rs b/crates/ide_completion/src/tests/expression.rs
index 77296d9099f..650c68134dd 100644
--- a/crates/ide_completion/src/tests/expression.rs
+++ b/crates/ide_completion/src/tests/expression.rs
@@ -642,3 +642,23 @@ fn main() {
         "]],
     );
 }
+
+#[test]
+fn detail_impl_trait_in_argument_position() {
+    check_empty(
+        r"
+//- minicore: sized
+trait Trait<T> {}
+struct Foo;
+impl Foo {
+    fn bar<U>(_: impl Trait<U>) {}
+}
+fn main() {
+    Foo::$0
+}
+",
+        expect![[r"
+            fn bar(…) fn(impl Trait<U>)
+        "]],
+    );
+}