Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/render.rs')
-rw-r--r--crates/ide-completion/src/render.rs28
1 files changed, 25 insertions, 3 deletions
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs
index dc7eacbfba..4f6c4cb663 100644
--- a/crates/ide-completion/src/render.rs
+++ b/crates/ide-completion/src/render.rs
@@ -628,11 +628,9 @@ fn compute_ref_match(
let expected_type = ctx.expected_type.as_ref()?;
let expected_without_ref = expected_type.remove_ref();
let completion_without_ref = completion_ty.remove_ref();
-
- if completion_ty == expected_type {
+ if expected_type.could_unify_with(ctx.db, completion_ty) {
return None;
}
-
if let Some(expected_without_ref) = &expected_without_ref {
if completion_ty.autoderef(ctx.db).any(|ty| ty == *expected_without_ref) {
cov_mark::hit!(suggest_ref);
@@ -2008,6 +2006,30 @@ fn f() {
}
#[test]
+ fn test_avoid_redundant_suggestion() {
+ check_relevance(
+ r#"
+struct aa([u8]);
+
+impl aa {
+ fn from_bytes(bytes: &[u8]) -> &Self {
+ unsafe { &*(bytes as *const [u8] as *const aa) }
+ }
+}
+
+fn bb()-> &'static aa {
+ let bytes = b"hello";
+ aa::$0
+}
+"#,
+ expect![[r#"
+ ex bb() [type]
+ fn from_bytes(…) fn(&[u8]) -> &aa [type_could_unify]
+ "#]],
+ );
+ }
+
+ #[test]
fn suggest_ref_mut() {
cov_mark::check!(suggest_ref);
check_relevance(