aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_completion/src/render.rs
diff options
context:
space:
mode:
authorJosh Mcguigan <[email protected]>2021-03-23 04:18:34 +0000
committerJosh Mcguigan <[email protected]>2021-03-26 16:18:18 +0000
commit0e31ae2cef92f973a6ee3def3f1feaa94dcb7a4f (patch)
tree50832b85e65752b040affcc8d34dc5cd8c2625b9 /crates/ide_completion/src/render.rs
parent957939292ec9038f139bd10e093e9673609eea04 (diff)
completion relevance distinguish between exact type match and could unify
Diffstat (limited to 'crates/ide_completion/src/render.rs')
-rw-r--r--crates/ide_completion/src/render.rs56
1 files changed, 37 insertions, 19 deletions
diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs
index 12453f889..1a762d3dc 100644
--- a/crates/ide_completion/src/render.rs
+++ b/crates/ide_completion/src/render.rs
@@ -20,8 +20,8 @@ use ide_db::{
20use syntax::TextRange; 20use syntax::TextRange;
21 21
22use crate::{ 22use crate::{
23 item::ImportEdit, CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, 23 item::{CompletionRelevanceTypeMatch, ImportEdit},
24 CompletionRelevance, 24 CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, CompletionRelevance,
25}; 25};
26 26
27use crate::render::{enum_variant::render_variant, function::render_fn, macro_::render_macro}; 27use crate::render::{enum_variant::render_variant, function::render_fn, macro_::render_macro};
@@ -143,7 +143,7 @@ impl<'a> Render<'a> {
143 .set_deprecated(is_deprecated); 143 .set_deprecated(is_deprecated);
144 144
145 item.set_relevance(CompletionRelevance { 145 item.set_relevance(CompletionRelevance {
146 exact_type_match: compute_exact_type_match(self.ctx.completion, ty), 146 type_match: compute_type_match(self.ctx.completion, ty),
147 exact_name_match: compute_exact_name_match(self.ctx.completion, name.to_string()), 147 exact_name_match: compute_exact_name_match(self.ctx.completion, name.to_string()),
148 ..CompletionRelevance::default() 148 ..CompletionRelevance::default()
149 }); 149 });
@@ -245,7 +245,7 @@ impl<'a> Render<'a> {
245 } 245 }
246 246
247 item.set_relevance(CompletionRelevance { 247 item.set_relevance(CompletionRelevance {
248 exact_type_match: compute_exact_type_match(self.ctx.completion, &ty), 248 type_match: compute_type_match(self.ctx.completion, &ty),
249 exact_name_match: compute_exact_name_match(self.ctx.completion, &local_name), 249 exact_name_match: compute_exact_name_match(self.ctx.completion, &local_name),
250 is_local: true, 250 is_local: true,
251 ..CompletionRelevance::default() 251 ..CompletionRelevance::default()
@@ -309,15 +309,24 @@ impl<'a> Render<'a> {
309 } 309 }
310} 310}
311 311
312fn compute_exact_type_match(ctx: &CompletionContext, completion_ty: &hir::Type) -> bool { 312fn compute_type_match(
313 match ctx.expected_type.as_ref() { 313 ctx: &CompletionContext,
314 Some(expected_type) => { 314 completion_ty: &hir::Type,
315 // We don't ever consider unit type to be an exact type match, since 315) -> Option<CompletionRelevanceTypeMatch> {
316 // nearly always this is not meaningful to the user. 316 let expected_type = ctx.expected_type.as_ref()?;
317 (completion_ty == expected_type || expected_type.could_unify_with(completion_ty)) 317
318 && !expected_type.is_unit() 318 // We don't ever consider unit type to be an exact type match, since
319 } 319 // nearly always this is not meaningful to the user.
320 None => false, 320 if expected_type.is_unit() {
321 return None;
322 }
323
324 if completion_ty == expected_type {
325 Some(CompletionRelevanceTypeMatch::Exact)
326 } else if expected_type.could_unify_with(completion_ty) {
327 Some(CompletionRelevanceTypeMatch::CouldUnify)
328 } else {
329 None
321 } 330 }
322} 331}
323 332
@@ -349,6 +358,7 @@ mod tests {
349 use itertools::Itertools; 358 use itertools::Itertools;
350 359
351 use crate::{ 360 use crate::{
361 item::CompletionRelevanceTypeMatch,
352 test_utils::{check_edit, do_completion, get_all_items, TEST_CONFIG}, 362 test_utils::{check_edit, do_completion, get_all_items, TEST_CONFIG},
353 CompletionKind, CompletionRelevance, 363 CompletionKind, CompletionRelevance,
354 }; 364 };
@@ -361,7 +371,11 @@ mod tests {
361 fn check_relevance(ra_fixture: &str, expect: Expect) { 371 fn check_relevance(ra_fixture: &str, expect: Expect) {
362 fn display_relevance(relevance: CompletionRelevance) -> String { 372 fn display_relevance(relevance: CompletionRelevance) -> String {
363 let relevance_factors = vec![ 373 let relevance_factors = vec![
364 (relevance.exact_type_match, "type"), 374 (relevance.type_match == Some(CompletionRelevanceTypeMatch::Exact), "type"),
375 (
376 relevance.type_match == Some(CompletionRelevanceTypeMatch::CouldUnify),
377 "type_could_unify",
378 ),
365 (relevance.exact_name_match, "name"), 379 (relevance.exact_name_match, "name"),
366 (relevance.is_local, "local"), 380 (relevance.is_local, "local"),
367 ] 381 ]
@@ -534,7 +548,9 @@ fn main() { let _: m::Spam = S$0 }
534 detail: "(i32)", 548 detail: "(i32)",
535 relevance: CompletionRelevance { 549 relevance: CompletionRelevance {
536 exact_name_match: false, 550 exact_name_match: false,
537 exact_type_match: true, 551 type_match: Some(
552 Exact,
553 ),
538 is_local: false, 554 is_local: false,
539 }, 555 },
540 trigger_call_info: true, 556 trigger_call_info: true,
@@ -560,7 +576,9 @@ fn main() { let _: m::Spam = S$0 }
560 detail: "()", 576 detail: "()",
561 relevance: CompletionRelevance { 577 relevance: CompletionRelevance {
562 exact_name_match: false, 578 exact_name_match: false,
563 exact_type_match: true, 579 type_match: Some(
580 Exact,
581 ),
564 is_local: false, 582 is_local: false,
565 }, 583 },
566 }, 584 },
@@ -1109,7 +1127,7 @@ fn main() {
1109 detail: "S", 1127 detail: "S",
1110 relevance: CompletionRelevance { 1128 relevance: CompletionRelevance {
1111 exact_name_match: true, 1129 exact_name_match: true,
1112 exact_type_match: false, 1130 type_match: None,
1113 is_local: true, 1131 is_local: true,
1114 }, 1132 },
1115 ref_match: "&mut ", 1133 ref_match: "&mut ",
@@ -1374,8 +1392,8 @@ fn foo() {
1374} 1392}
1375"#, 1393"#,
1376 expect![[r#" 1394 expect![[r#"
1377 ev Foo::A(…) [type] 1395 ev Foo::A(…) [type_could_unify]
1378 ev Foo::B [type] 1396 ev Foo::B [type_could_unify]
1379 lc foo [type+local] 1397 lc foo [type+local]
1380 en Foo [] 1398 en Foo []
1381 fn baz() [] 1399 fn baz() []