Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/item.rs')
| -rw-r--r-- | crates/ide-completion/src/item.rs | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/crates/ide-completion/src/item.rs b/crates/ide-completion/src/item.rs index b91f915619..dc2f9a7680 100644 --- a/crates/ide-completion/src/item.rs +++ b/crates/ide-completion/src/item.rs @@ -79,7 +79,7 @@ pub struct CompletionItem { // FIXME: We shouldn't expose Mutability here (that is HIR types at all), its fine for now though // until we have more splitting completions in which case we should think about // generalizing this. See https://github.com/rust-lang/rust-analyzer/issues/12571 - pub ref_match: Option<(Mutability, TextSize)>, + pub ref_match: Option<(CompletionItemRefMode, TextSize)>, /// The import data to add to completion's edits. /// (ImportPath, LastSegment) @@ -128,8 +128,15 @@ impl fmt::Debug for CompletionItem { s.field("relevance", &self.relevance); } - if let Some((mutability, offset)) = &self.ref_match { - s.field("ref_match", &format!("&{}@{offset:?}", mutability.as_keyword_for_ref())); + if let Some((ref_mode, offset)) = self.ref_match { + let prefix = match ref_mode { + CompletionItemRefMode::Reference(mutability) => match mutability { + Mutability::Shared => "&", + Mutability::Mut => "&mut ", + }, + CompletionItemRefMode::Dereference => "*", + }; + s.field("ref_match", &format!("{}@{offset:?}", prefix)); } if self.trigger_call_info { s.field("trigger_call_info", &true); @@ -400,6 +407,12 @@ impl CompletionItemKind { } } +#[derive(Copy, Clone, Debug)] +pub enum CompletionItemRefMode { + Reference(Mutability), + Dereference, +} + impl CompletionItem { pub(crate) fn new( kind: impl Into<CompletionItemKind>, @@ -441,15 +454,14 @@ impl CompletionItem { let mut relevance = self.relevance; relevance.type_match = Some(CompletionRelevanceTypeMatch::Exact); - self.ref_match.map(|(mutability, offset)| { - ( - format!("&{}{}", mutability.as_keyword_for_ref(), self.label.primary), - ide_db::text_edit::Indel::insert( - offset, - format!("&{}", mutability.as_keyword_for_ref()), - ), - relevance, - ) + self.ref_match.map(|(mode, offset)| { + let prefix = match mode { + CompletionItemRefMode::Reference(Mutability::Shared) => "&", + CompletionItemRefMode::Reference(Mutability::Mut) => "&mut ", + CompletionItemRefMode::Dereference => "*", + }; + let label = format!("{prefix}{}", self.label.primary); + (label, ide_db::text_edit::Indel::insert(offset, String::from(prefix)), relevance) }) } } @@ -473,7 +485,7 @@ pub(crate) struct Builder { deprecated: bool, trigger_call_info: bool, relevance: CompletionRelevance, - ref_match: Option<(Mutability, TextSize)>, + ref_match: Option<(CompletionItemRefMode, TextSize)>, edition: Edition, } @@ -657,8 +669,12 @@ impl Builder { self.imports_to_add.push(import_to_add); self } - pub(crate) fn ref_match(&mut self, mutability: Mutability, offset: TextSize) -> &mut Builder { - self.ref_match = Some((mutability, offset)); + pub(crate) fn ref_match( + &mut self, + ref_mode: CompletionItemRefMode, + offset: TextSize, + ) -> &mut Builder { + self.ref_match = Some((ref_mode, offset)); self } } |