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.rs46
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
}
}