diff options
author | Josh Mcguigan <[email protected]> | 2021-03-16 02:26:59 +0000 |
---|---|---|
committer | Josh Mcguigan <[email protected]> | 2021-03-16 02:40:42 +0000 |
commit | 405bbb3aa46ecbfa5124969739695565d9841b9c (patch) | |
tree | d72f4691d4ebb199953fa2ffb52ed3a8b1501a73 /crates/ide_completion/src/render | |
parent | c0a2b4e826e1da20d3cfa8c279fcdffa24f32a7d (diff) |
completions: centralize calculation of relevance and ref matches
Diffstat (limited to 'crates/ide_completion/src/render')
-rw-r--r-- | crates/ide_completion/src/render/enum_variant.rs | 13 | ||||
-rw-r--r-- | crates/ide_completion/src/render/function.rs | 27 |
2 files changed, 25 insertions, 15 deletions
diff --git a/crates/ide_completion/src/render/enum_variant.rs b/crates/ide_completion/src/render/enum_variant.rs index e8cfcc0c7..374247b05 100644 --- a/crates/ide_completion/src/render/enum_variant.rs +++ b/crates/ide_completion/src/render/enum_variant.rs | |||
@@ -6,7 +6,8 @@ use itertools::Itertools; | |||
6 | 6 | ||
7 | use crate::{ | 7 | use crate::{ |
8 | item::{CompletionItem, CompletionKind, ImportEdit}, | 8 | item::{CompletionItem, CompletionKind, ImportEdit}, |
9 | render::{builder_ext::Params, RenderContext}, | 9 | render::{builder_ext::Params, compute_exact_type_match, compute_ref_match, RenderContext}, |
10 | CompletionRelevance, | ||
10 | }; | 11 | }; |
11 | 12 | ||
12 | pub(crate) fn render_variant<'a>( | 13 | pub(crate) fn render_variant<'a>( |
@@ -74,6 +75,16 @@ impl<'a> EnumRender<'a> { | |||
74 | item.lookup_by(self.short_qualified_name); | 75 | item.lookup_by(self.short_qualified_name); |
75 | } | 76 | } |
76 | 77 | ||
78 | let ty = self.variant.parent_enum(self.ctx.completion.db).ty(self.ctx.completion.db); | ||
79 | item.set_relevance(CompletionRelevance { | ||
80 | exact_type_match: compute_exact_type_match(self.ctx.completion, &ty), | ||
81 | ..CompletionRelevance::default() | ||
82 | }); | ||
83 | |||
84 | if let Some(ref_match) = compute_ref_match(self.ctx.completion, &ty) { | ||
85 | item.ref_match(ref_match); | ||
86 | } | ||
87 | |||
77 | item.build() | 88 | item.build() |
78 | } | 89 | } |
79 | 90 | ||
diff --git a/crates/ide_completion/src/render/function.rs b/crates/ide_completion/src/render/function.rs index 47e26a5d8..194ea135e 100644 --- a/crates/ide_completion/src/render/function.rs +++ b/crates/ide_completion/src/render/function.rs | |||
@@ -6,7 +6,10 @@ use syntax::ast::Fn; | |||
6 | 6 | ||
7 | use crate::{ | 7 | use crate::{ |
8 | item::{CompletionItem, CompletionItemKind, CompletionKind, CompletionRelevance, ImportEdit}, | 8 | item::{CompletionItem, CompletionItemKind, CompletionKind, CompletionRelevance, ImportEdit}, |
9 | render::{builder_ext::Params, RenderContext}, | 9 | render::{ |
10 | builder_ext::Params, compute_exact_name_match, compute_exact_type_match, compute_ref_match, | ||
11 | RenderContext, | ||
12 | }, | ||
10 | }; | 13 | }; |
11 | 14 | ||
12 | pub(crate) fn render_fn<'a>( | 15 | pub(crate) fn render_fn<'a>( |
@@ -52,23 +55,19 @@ impl<'a> FunctionRender<'a> { | |||
52 | self.ctx.is_deprecated(self.func) || self.ctx.is_deprecated_assoc_item(self.func), | 55 | self.ctx.is_deprecated(self.func) || self.ctx.is_deprecated_assoc_item(self.func), |
53 | ) | 56 | ) |
54 | .detail(self.detail()) | 57 | .detail(self.detail()) |
55 | .add_call_parens(self.ctx.completion, self.name, params) | 58 | .add_call_parens(self.ctx.completion, self.name.clone(), params) |
56 | .add_import(import_to_add); | 59 | .add_import(import_to_add); |
57 | 60 | ||
58 | let mut relevance = CompletionRelevance::default(); | 61 | let ret_type = self.func.ret_type(self.ctx.db()); |
59 | if let Some(expected_type) = &self.ctx.completion.expected_type { | 62 | item.set_relevance(CompletionRelevance { |
60 | let ret_ty = self.func.ret_type(self.ctx.db()); | 63 | exact_type_match: compute_exact_type_match(self.ctx.completion, &ret_type), |
64 | exact_name_match: compute_exact_name_match(self.ctx.completion, self.name.clone()), | ||
65 | ..CompletionRelevance::default() | ||
66 | }); | ||
61 | 67 | ||
62 | // We don't ever consider a function which returns unit type to be an | 68 | if let Some(ref_match) = compute_ref_match(self.ctx.completion, &ret_type) { |
63 | // exact type match, since nearly always this is not meaningful to the | 69 | item.ref_match(ref_match); |
64 | // user. | ||
65 | relevance.exact_type_match = &ret_ty == expected_type && !ret_ty.is_unit(); | ||
66 | } | 70 | } |
67 | if let Some(expected_name) = &self.ctx.completion.expected_name { | ||
68 | relevance.exact_name_match = | ||
69 | expected_name == &self.func.name(self.ctx.db()).to_string(); | ||
70 | } | ||
71 | item.set_relevance(relevance); | ||
72 | 71 | ||
73 | item.build() | 72 | item.build() |
74 | } | 73 | } |