aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_completion/src/render.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide_completion/src/render.rs')
-rw-r--r--crates/ide_completion/src/render.rs25
1 files changed, 4 insertions, 21 deletions
diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs
index 905f0b197..670563e50 100644
--- a/crates/ide_completion/src/render.rs
+++ b/crates/ide_completion/src/render.rs
@@ -118,19 +118,6 @@ impl<'a> RenderContext<'a> {
118 fn docs(&self, node: impl HasAttrs) -> Option<Documentation> { 118 fn docs(&self, node: impl HasAttrs) -> Option<Documentation> {
119 node.docs(self.db()) 119 node.docs(self.db())
120 } 120 }
121
122 fn expected_name_and_type(&self) -> Option<(String, Type)> {
123 if let Some(record_field) = &self.completion.record_field_syntax {
124 cov_mark::hit!(record_field_type_match);
125 let (struct_field, _local) = self.completion.sema.resolve_record_field(record_field)?;
126 Some((struct_field.name(self.db()).to_string(), struct_field.signature_ty(self.db())))
127 } else if let Some(active_parameter) = &self.completion.active_parameter {
128 cov_mark::hit!(active_param_type_match);
129 Some((active_parameter.name.clone(), active_parameter.ty.clone()))
130 } else {
131 None
132 }
133 }
134} 121}
135 122
136/// Generic renderer for completion items. 123/// Generic renderer for completion items.
@@ -256,8 +243,8 @@ impl<'a> Render<'a> {
256 relevance.is_local = true; 243 relevance.is_local = true;
257 item.set_relevance(relevance); 244 item.set_relevance(relevance);
258 245
259 if let Some((_expected_name, expected_type)) = self.ctx.expected_name_and_type() { 246 if let Some(expected_type) = self.ctx.completion.expected_type.as_ref() {
260 if ty != expected_type { 247 if &ty != expected_type {
261 if let Some(ty_without_ref) = expected_type.remove_ref() { 248 if let Some(ty_without_ref) = expected_type.remove_ref() {
262 if relevance_type_match(self.ctx.db().upcast(), &ty, &ty_without_ref) { 249 if relevance_type_match(self.ctx.db().upcast(), &ty, &ty_without_ref) {
263 cov_mark::hit!(suggest_ref); 250 cov_mark::hit!(suggest_ref);
@@ -329,10 +316,8 @@ impl<'a> Render<'a> {
329fn compute_relevance(ctx: &RenderContext, ty: &Type, name: &str) -> CompletionRelevance { 316fn compute_relevance(ctx: &RenderContext, ty: &Type, name: &str) -> CompletionRelevance {
330 let mut res = CompletionRelevance::default(); 317 let mut res = CompletionRelevance::default();
331 318
332 if let Some((expected_name, expected_type)) = ctx.expected_name_and_type() { 319 res.exact_type_match = Some(ty) == ctx.completion.expected_type.as_ref();
333 res.exact_type_match = ty == &expected_type; 320 res.exact_name_match = Some(name) == ctx.completion.expected_name.as_deref();
334 res.exact_name_match = name == &expected_name;
335 }
336 321
337 res 322 res
338} 323}
@@ -852,7 +837,6 @@ fn foo(xs: Vec<i128>)
852 837
853 #[test] 838 #[test]
854 fn active_param_relevance() { 839 fn active_param_relevance() {
855 cov_mark::check!(active_param_type_match);
856 check_relevance( 840 check_relevance(
857 r#" 841 r#"
858struct S { foo: i64, bar: u32, baz: u32 } 842struct S { foo: i64, bar: u32, baz: u32 }
@@ -869,7 +853,6 @@ fn foo(s: S) { test(s.$0) }
869 853
870 #[test] 854 #[test]
871 fn record_field_relevances() { 855 fn record_field_relevances() {
872 cov_mark::check!(record_field_type_match);
873 check_relevance( 856 check_relevance(
874 r#" 857 r#"
875struct A { foo: i64, bar: u32, baz: u32 } 858struct A { foo: i64, bar: u32, baz: u32 }