Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/context/analysis.rs')
-rw-r--r--crates/ide-completion/src/context/analysis.rs18
1 files changed, 17 insertions, 1 deletions
diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs
index add637a16f..b65c68a240 100644
--- a/crates/ide-completion/src/context/analysis.rs
+++ b/crates/ide-completion/src/context/analysis.rs
@@ -600,10 +600,26 @@ fn expected_type_and_name<'db>(
Some(it) => it,
None => return ty,
};
- for _ in top_syn.ancestors().skip(1).map_while(ast::RefExpr::cast) {
+ let refs_level = top_syn
+ .ancestors()
+ .skip(1)
+ .map_while(Either::<ast::RefExpr, ast::PrefixExpr>::cast)
+ .take_while(|it| match it {
+ Either::Left(_) => true,
+ Either::Right(prefix) => prefix.op_kind() == Some(ast::UnaryOp::Deref),
+ })
+ .fold(0i32, |level, expr| match expr {
+ Either::Left(_) => level + 1,
+ Either::Right(_) => level - 1,
+ });
+ for _ in 0..refs_level {
cov_mark::hit!(expected_type_fn_param_ref);
ty = ty.strip_reference();
}
+ for _ in refs_level..0 {
+ cov_mark::hit!(expected_type_fn_param_deref);
+ ty = ty.add_reference(hir::Mutability::Shared);
+ }
ty
}
_ => ty,