diff options
| author | bors <bors@rust-lang.org> | 2022-04-16 21:13:07 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-04-16 21:13:07 +0000 |
| commit | 53afd2a707138230dee582fa1d5c3075cab2b6b7 (patch) | |
| tree | 666068dcf992de3dbd9bede11a31fbd32b0d0483 | |
| parent | dc6aa056fd5e761b6ab34b72487a5f3ba83bc34a (diff) | |
| parent | d26deb5b9facc77d3f786026079e42ff60cad707 (diff) | |
| download | rust-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.rs | 38 | ||||
| -rw-r--r-- | crates/ide_completion/src/tests/expression.rs | 20 |
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>) + "]], + ); +} |
