Restore CompletionItem immutability

This commit is contained in:
Aleksey Kladov 2020-04-24 01:17:33 +02:00
parent 6654b9aff3
commit 953b5f23cc
2 changed files with 22 additions and 30 deletions

View File

@ -190,7 +190,7 @@ impl CompletionItem {
} }
/// What string is used for filtering. /// What string is used for filtering.
pub fn lookup(&self) -> &str { 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<CompletionItemKind> { pub fn kind(&self) -> Option<CompletionItemKind> {
@ -205,10 +205,6 @@ impl CompletionItem {
self.score self.score
} }
pub fn set_score(&mut self, score: CompletionScore) {
self.score = Some(score);
}
pub fn trigger_call_info(&self) -> bool { pub fn trigger_call_info(&self) -> bool {
self.trigger_call_info self.trigger_call_info
} }
@ -310,7 +306,6 @@ impl Builder {
self.deprecated = Some(deprecated); self.deprecated = Some(deprecated);
self self
} }
#[allow(unused)]
pub(crate) fn set_score(mut self, score: CompletionScore) -> Builder { pub(crate) fn set_score(mut self, score: CompletionScore) -> Builder {
self.score = Some(score); self.score = Some(score);
self self

View File

@ -23,22 +23,20 @@ impl Completions {
ty: &Type, ty: &Type,
) { ) {
let is_deprecated = is_deprecated(field, ctx.db); let is_deprecated = is_deprecated(field, ctx.db);
let mut completion_item = CompletionItem::new( let ty = ty.display(ctx.db).to_string();
CompletionKind::Reference, let name = field.name(ctx.db);
ctx.source_range(), let mut completion_item =
field.name(ctx.db).to_string(), CompletionItem::new(CompletionKind::Reference, ctx.source_range(), name.to_string())
)
.kind(CompletionItemKind::Field) .kind(CompletionItemKind::Field)
.detail(ty.display(ctx.db).to_string()) .detail(ty.clone())
.set_documentation(field.docs(ctx.db)) .set_documentation(field.docs(ctx.db))
.set_deprecated(is_deprecated) .set_deprecated(is_deprecated);
.build();
if let Some(score) = compute_score(&completion_item, ctx) { if let Some(score) = compute_score(ctx, &ty, &name.to_string()) {
completion_item.set_score(score); 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) { 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( pub(crate) fn compute_score(
completion_item: &CompletionItem,
ctx: &CompletionContext, ctx: &CompletionContext,
ty: &str,
name: &str,
) -> Option<CompletionScore> { ) -> Option<CompletionScore> {
let (active_name, active_type) = if let Some(record_field) = &ctx.record_field_syntax { 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) { if let Some((struct_field, _)) = ctx.sema.resolve_record_field(record_field) {
@ -334,17 +333,15 @@ pub(crate) fn compute_score(
// Compute score // Compute score
// For the same type // For the same type
if let Some(a_parameter_type) = completion_item.detail() { if &active_type == ty {
if &active_type == a_parameter_type {
// If same type + same name then go top position // If same type + same name then go top position
let res = if active_name == completion_item.label() { let res = if active_name == name {
CompletionScore::TypeAndNameMatch CompletionScore::TypeAndNameMatch
} else { } else {
CompletionScore::TypeMatch CompletionScore::TypeMatch
}; };
return Some(res); return Some(res);
} }
}
None None
} }