diff options
| author | iDawer <ilnur.iskhakov.oss@outlook.com> | 2022-04-12 20:40:31 +0500 |
|---|---|---|
| committer | iDawer <ilnur.iskhakov.oss@outlook.com> | 2022-04-16 13:41:10 +0500 |
| commit | f972adc2012fc49b35124d080a000a0d44c95452 (patch) | |
| tree | 85420ee8f0ddf62e4fe1445fbbdca8df54af01a6 | |
| parent | 66c232d03baadecf5318a77837f0f8b6166c0796 (diff) | |
| download | rust-f972adc2012fc49b35124d080a000a0d44c95452.tar.gz rust-f972adc2012fc49b35124d080a000a0d44c95452.zip | |
fix: comletion detail shows `{unknown}` for `impl Trait` in return position
| -rw-r--r-- | crates/hir/src/lib.rs | 6 | ||||
| -rw-r--r-- | crates/ide_completion/src/tests/expression.rs | 39 |
2 files changed, 42 insertions, 3 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 06056217fdb..7cda75b3478 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -1358,9 +1358,9 @@ impl Function { /// Get this function's return type pub fn ret_type(self, db: &dyn HirDatabase) -> Type { let resolver = self.id.resolver(db.upcast()); - let ret_type = &db.function_data(self.id).ret_type; - let ctx = hir_ty::TyLoweringContext::new(db, &resolver); - let ty = ctx.lower_ty(ret_type); + let substs = TyBuilder::placeholder_subst(db, self.id); + let callable_sig = db.callable_item_signature(self.id.into()).substitute(Interner, &substs); + let ty = callable_sig.ret().clone(); 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 f1950235d46..f25e14e0fcd 100644 --- a/crates/ide_completion/src/tests/expression.rs +++ b/crates/ide_completion/src/tests/expression.rs @@ -602,3 +602,42 @@ fn func() { "#]], ); } + +#[test] +fn detail_impl_trait_in_return_position() { + check_empty( + r" +//- minicore: sized +trait Trait<T> {} +fn foo<U>() -> impl Trait<U> {} +fn main() { + self::$0 +} +", + expect![[r" + tt Trait + fn main() fn() + fn foo() fn() -> impl Trait<U> + "]], + ); +} + +#[test] +fn detail_async_fn() { + // FIXME: #11438 + check_empty( + r#" +//- minicore: future, sized +trait Trait<T> {} +async fn foo() -> u8 {} +fn main() { + self::$0 +} +"#, + expect![[r" + tt Trait + fn main() fn() + fn foo() async fn() -> impl Future<Output = u8> + "]], + ); +} |
