Skip to content

Commit bbe1fbd

Browse files
Qualify autoimport completion suggestions
1 parent 38ef1fd commit bbe1fbd

File tree

2 files changed

+43
-16
lines changed

2 files changed

+43
-16
lines changed

crates/completion/src/completions/unqualified_path.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &T
7171
}
7272
}
7373

74-
// TODO kb add a setting toggle for this feature?
7574
fn fuzzy_completion(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
7675
let _p = profile::span("fuzzy_completion®");
7776
let current_module = ctx.scope.module()?;
@@ -97,23 +96,35 @@ fn fuzzy_completion(acc: &mut Completions, ctx: &CompletionContext) -> Option<()
9796
})
9897
.filter(|(mod_path, _)| mod_path.len() > 1)
9998
.filter_map(|(mod_path, definition)| {
100-
let mut resolution_with_missing_import = render_resolution(
101-
RenderContext::new(ctx),
102-
mod_path.segments.last()?.to_string(),
103-
&definition,
104-
)?;
99+
let use_to_insert = mod_path_to_ast(&mod_path);
100+
let mut mod_path_without_last_segment = mod_path;
101+
let name_after_import = mod_path_without_last_segment.segments.pop()?.to_string();
102+
103+
let resolution_with_missing_import =
104+
render_resolution(RenderContext::new(ctx), name_after_import, &definition)?;
105+
let lookup_string = resolution_with_missing_import.lookup().to_owned();
105106

106107
let mut text_edits =
107108
resolution_with_missing_import.text_edit().to_owned().into_builder();
108-
109-
let rewriter =
110-
insert_use(&import_scope, mod_path_to_ast(&mod_path), ctx.config.merge);
109+
let rewriter = insert_use(&import_scope, use_to_insert, ctx.config.merge);
111110
let old_ast = rewriter.rewrite_root()?;
112111
algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut text_edits);
113112

114-
resolution_with_missing_import.update_text_edit(text_edits.finish());
115-
116-
Some(resolution_with_missing_import)
113+
let qualifier_string = mod_path_without_last_segment.to_string();
114+
let qualified_label = if qualifier_string.is_empty() {
115+
resolution_with_missing_import.label().to_owned()
116+
} else {
117+
format!("{}::{}", qualifier_string, resolution_with_missing_import.label())
118+
};
119+
120+
Some(
121+
resolution_with_missing_import
122+
.into_builder()
123+
.text_edit(text_edits.finish())
124+
.label(qualified_label)
125+
.lookup_by(lookup_string)
126+
.build(),
127+
)
117128
})
118129
.take(20);
119130

crates/completion/src/item.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,26 @@ impl CompletionItem {
202202
ref_match: None,
203203
}
204204
}
205+
206+
pub(crate) fn into_builder(self) -> Builder {
207+
Builder {
208+
source_range: self.source_range,
209+
completion_kind: self.completion_kind,
210+
label: self.label,
211+
insert_text: None,
212+
insert_text_format: self.insert_text_format,
213+
detail: self.detail,
214+
documentation: self.documentation,
215+
lookup: self.lookup,
216+
kind: self.kind,
217+
text_edit: Some(self.text_edit),
218+
deprecated: Some(self.deprecated),
219+
trigger_call_info: Some(self.trigger_call_info),
220+
score: self.score,
221+
ref_match: self.ref_match,
222+
}
223+
}
224+
205225
/// What user sees in pop-up in the UI.
206226
pub fn label(&self) -> &str {
207227
&self.label
@@ -218,10 +238,6 @@ impl CompletionItem {
218238
&self.text_edit
219239
}
220240

221-
pub fn update_text_edit(&mut self, new_text_edit: TextEdit) {
222-
self.text_edit = new_text_edit;
223-
}
224-
225241
/// Short one-line additional information, like a type
226242
pub fn detail(&self) -> Option<&str> {
227243
self.detail.as_deref()

0 commit comments

Comments
 (0)