From 953b5f23cc493d75288cec1347ab65dd3ed38fd7 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 24 Apr 2020 01:17:33 +0200 Subject: Restore CompletionItem immutability --- crates/ra_ide/src/completion/completion_item.rs | 7 +--- crates/ra_ide/src/completion/presentation.rs | 47 ++++++++++++------------- 2 files changed, 23 insertions(+), 31 deletions(-) (limited to 'crates') diff --git a/crates/ra_ide/src/completion/completion_item.rs b/crates/ra_ide/src/completion/completion_item.rs index 687b380bb..edbf4a5b7 100644 --- a/crates/ra_ide/src/completion/completion_item.rs +++ b/crates/ra_ide/src/completion/completion_item.rs @@ -190,7 +190,7 @@ impl CompletionItem { } /// What string is used for filtering. pub fn lookup(&self) -> &str { - self.lookup.as_deref().unwrap_or_else(|| self.label()) + self.lookup.as_deref().unwrap_or(&self.label) } pub fn kind(&self) -> Option { @@ -205,10 +205,6 @@ impl CompletionItem { self.score } - pub fn set_score(&mut self, score: CompletionScore) { - self.score = Some(score); - } - pub fn trigger_call_info(&self) -> bool { self.trigger_call_info } @@ -310,7 +306,6 @@ impl Builder { self.deprecated = Some(deprecated); self } - #[allow(unused)] pub(crate) fn set_score(mut self, score: CompletionScore) -> Builder { self.score = Some(score); self diff --git a/crates/ra_ide/src/completion/presentation.rs b/crates/ra_ide/src/completion/presentation.rs index 5aedfc47f..6d8a5dc08 100644 --- a/crates/ra_ide/src/completion/presentation.rs +++ b/crates/ra_ide/src/completion/presentation.rs @@ -23,22 +23,20 @@ impl Completions { ty: &Type, ) { let is_deprecated = is_deprecated(field, ctx.db); - let mut completion_item = CompletionItem::new( - CompletionKind::Reference, - ctx.source_range(), - field.name(ctx.db).to_string(), - ) - .kind(CompletionItemKind::Field) - .detail(ty.display(ctx.db).to_string()) - .set_documentation(field.docs(ctx.db)) - .set_deprecated(is_deprecated) - .build(); - - if let Some(score) = compute_score(&completion_item, ctx) { - completion_item.set_score(score); + let ty = ty.display(ctx.db).to_string(); + let name = field.name(ctx.db); + let mut completion_item = + CompletionItem::new(CompletionKind::Reference, ctx.source_range(), name.to_string()) + .kind(CompletionItemKind::Field) + .detail(ty.clone()) + .set_documentation(field.docs(ctx.db)) + .set_deprecated(is_deprecated); + + if let Some(score) = compute_score(ctx, &ty, &name.to_string()) { + completion_item = completion_item.set_score(score); } - self.add(completion_item); + completion_item.add_to(self); } pub(crate) fn add_tuple_field(&mut self, ctx: &CompletionContext, field: usize, ty: &Type) { @@ -308,8 +306,9 @@ impl Completions { } pub(crate) fn compute_score( - completion_item: &CompletionItem, ctx: &CompletionContext, + ty: &str, + name: &str, ) -> Option { let (active_name, active_type) = if let Some(record_field) = &ctx.record_field_syntax { if let Some((struct_field, _)) = ctx.sema.resolve_record_field(record_field) { @@ -334,16 +333,14 @@ pub(crate) fn compute_score( // Compute score // For the same type - if let Some(a_parameter_type) = completion_item.detail() { - if &active_type == a_parameter_type { - // If same type + same name then go top position - let res = if active_name == completion_item.label() { - CompletionScore::TypeAndNameMatch - } else { - CompletionScore::TypeMatch - }; - return Some(res); - } + if &active_type == ty { + // If same type + same name then go top position + let res = if active_name == name { + CompletionScore::TypeAndNameMatch + } else { + CompletionScore::TypeMatch + }; + return Some(res); } None } -- cgit v1.2.3