aboutsummaryrefslogtreecommitdiff
path: root/crates/completion
diff options
context:
space:
mode:
authorKirill Bulatov <[email protected]>2020-11-14 12:50:57 +0000
committerKirill Bulatov <[email protected]>2020-11-16 19:19:06 +0000
commitbbe1fbd1786b416908d3c6bc34c8cf805b39b761 (patch)
treedd11219a9e5d2f48d7c6e28e0f6554ccff5c0096 /crates/completion
parent38ef1fd4ad7fd26439201a1a4147a7d90a13601f (diff)
Qualify autoimport completion suggestions
Diffstat (limited to 'crates/completion')
-rw-r--r--crates/completion/src/completions/unqualified_path.rs35
-rw-r--r--crates/completion/src/item.rs24
2 files changed, 43 insertions, 16 deletions
diff --git a/crates/completion/src/completions/unqualified_path.rs b/crates/completion/src/completions/unqualified_path.rs
index 7ce92a07b..fca8d3a72 100644
--- a/crates/completion/src/completions/unqualified_path.rs
+++ b/crates/completion/src/completions/unqualified_path.rs
@@ -71,7 +71,6 @@ fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &T
71 } 71 }
72} 72}
73 73
74// TODO kb add a setting toggle for this feature?
75fn fuzzy_completion(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> { 74fn fuzzy_completion(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
76 let _p = profile::span("fuzzy_completion®"); 75 let _p = profile::span("fuzzy_completion®");
77 let current_module = ctx.scope.module()?; 76 let current_module = ctx.scope.module()?;
@@ -97,23 +96,35 @@ fn fuzzy_completion(acc: &mut Completions, ctx: &CompletionContext) -> Option<()
97 }) 96 })
98 .filter(|(mod_path, _)| mod_path.len() > 1) 97 .filter(|(mod_path, _)| mod_path.len() > 1)
99 .filter_map(|(mod_path, definition)| { 98 .filter_map(|(mod_path, definition)| {
100 let mut resolution_with_missing_import = render_resolution( 99 let use_to_insert = mod_path_to_ast(&mod_path);
101 RenderContext::new(ctx), 100 let mut mod_path_without_last_segment = mod_path;
102 mod_path.segments.last()?.to_string(), 101 let name_after_import = mod_path_without_last_segment.segments.pop()?.to_string();
103 &definition, 102
104 )?; 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();
105 106
106 let mut text_edits = 107 let mut text_edits =
107 resolution_with_missing_import.text_edit().to_owned().into_builder(); 108 resolution_with_missing_import.text_edit().to_owned().into_builder();
108 109 let rewriter = insert_use(&import_scope, use_to_insert, ctx.config.merge);
109 let rewriter =
110 insert_use(&import_scope, mod_path_to_ast(&mod_path), ctx.config.merge);
111 let old_ast = rewriter.rewrite_root()?; 110 let old_ast = rewriter.rewrite_root()?;
112 algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut text_edits); 111 algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut text_edits);
113 112
114 resolution_with_missing_import.update_text_edit(text_edits.finish()); 113 let qualifier_string = mod_path_without_last_segment.to_string();
115 114 let qualified_label = if qualifier_string.is_empty() {
116 Some(resolution_with_missing_import) 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 )
117 }) 128 })
118 .take(20); 129 .take(20);
119 130
diff --git a/crates/completion/src/item.rs b/crates/completion/src/item.rs
index 53a12a763..24b9d036a 100644
--- a/crates/completion/src/item.rs
+++ b/crates/completion/src/item.rs
@@ -202,6 +202,26 @@ impl CompletionItem {
202 ref_match: None, 202 ref_match: None,
203 } 203 }
204 } 204 }
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
205 /// What user sees in pop-up in the UI. 225 /// What user sees in pop-up in the UI.
206 pub fn label(&self) -> &str { 226 pub fn label(&self) -> &str {
207 &self.label 227 &self.label
@@ -218,10 +238,6 @@ impl CompletionItem {
218 &self.text_edit 238 &self.text_edit
219 } 239 }
220 240
221 pub fn update_text_edit(&mut self, new_text_edit: TextEdit) {
222 self.text_edit = new_text_edit;
223 }
224
225 /// Short one-line additional information, like a type 241 /// Short one-line additional information, like a type
226 pub fn detail(&self) -> Option<&str> { 242 pub fn detail(&self) -> Option<&str> {
227 self.detail.as_deref() 243 self.detail.as_deref()