Skip to content

Commit d9bd1f1

Browse files
Add eager resolve capability
1 parent 2a7be4a commit d9bd1f1

File tree

8 files changed

+43
-13
lines changed

8 files changed

+43
-13
lines changed

crates/completion/src/config.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ impl CompletionConfig {
2929
pub fn allow_snippets(&mut self, yes: bool) {
3030
self.snippet_cap = if yes { Some(SnippetCap { _private: () }) } else { None }
3131
}
32+
33+
pub fn should_resolve_immediately(&self) -> bool {
34+
!self.resolve_capabilities.contains(&CompletionResolveCapability::AdditionalTextEdits)
35+
}
3236
}
3337

3438
#[derive(Clone, Copy, Debug, PartialEq, Eq)]

crates/completion/src/item.rs

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
use std::fmt;
44

55
use hir::{Documentation, ModPath, Mutability};
6-
use ide_db::helpers::insert_use::{ImportScope, MergeBehaviour};
7-
use syntax::TextRange;
6+
use ide_db::helpers::{
7+
insert_use::{self, ImportScope, MergeBehaviour},
8+
mod_path_to_ast,
9+
};
10+
use syntax::{algo, TextRange};
811
use text_edit::TextEdit;
912

1013
use crate::config::SnippetCap;
@@ -207,6 +210,7 @@ impl CompletionItem {
207210
score: None,
208211
ref_match: None,
209212
import_to_add: None,
213+
resolve_import_immediately: true,
210214
}
211215
}
212216

@@ -279,6 +283,7 @@ pub(crate) struct Builder {
279283
source_range: TextRange,
280284
completion_kind: CompletionKind,
281285
import_to_add: Option<ImportToAdd>,
286+
resolve_import_immediately: bool,
282287
label: String,
283288
insert_text: Option<String>,
284289
insert_text_format: InsertTextFormat,
@@ -300,6 +305,7 @@ impl Builder {
300305
let mut label = self.label;
301306
let mut lookup = self.lookup;
302307
let mut insert_text = self.insert_text;
308+
let mut text_edits = TextEdit::builder();
303309

304310
if let Some(import_to_add) = self.import_to_add.as_ref() {
305311
let mut import_path_without_last_segment = import_to_add.import_path.to_owned();
@@ -314,20 +320,35 @@ impl Builder {
314320
}
315321
label = format!("{}::{}", import_path_without_last_segment, label);
316322
}
323+
324+
if self.resolve_import_immediately {
325+
let rewriter = insert_use::insert_use(
326+
&import_to_add.import_scope,
327+
mod_path_to_ast(&import_to_add.import_path),
328+
import_to_add.merge_behaviour,
329+
);
330+
if let Some(old_ast) = rewriter.rewrite_root() {
331+
algo::diff(&old_ast, &rewriter.rewrite(&old_ast))
332+
.into_text_edit(&mut text_edits);
333+
}
334+
}
317335
}
318336

319-
let text_edit = match self.text_edit {
337+
let original_edit = match self.text_edit {
320338
Some(it) => it,
321339
None => {
322340
TextEdit::replace(self.source_range, insert_text.unwrap_or_else(|| label.clone()))
323341
}
324342
};
325343

344+
let mut resulting_edit = text_edits.finish();
345+
resulting_edit.union(original_edit).expect("Failed to unite text edits");
346+
326347
CompletionItem {
327348
source_range: self.source_range,
328349
label,
329350
insert_text_format: self.insert_text_format,
330-
text_edit,
351+
text_edit: resulting_edit,
331352
detail: self.detail,
332353
documentation: self.documentation,
333354
lookup,
@@ -400,8 +421,13 @@ impl Builder {
400421
self.trigger_call_info = Some(true);
401422
self
402423
}
403-
pub(crate) fn add_import(mut self, import_to_add: Option<ImportToAdd>) -> Builder {
424+
pub(crate) fn add_import(
425+
mut self,
426+
import_to_add: Option<ImportToAdd>,
427+
resolve_import_immediately: bool,
428+
) -> Builder {
404429
self.import_to_add = import_to_add;
430+
self.resolve_import_immediately = resolve_import_immediately;
405431
self
406432
}
407433
pub(crate) fn set_ref_match(

crates/completion/src/render.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ impl<'a> Render<'a> {
194194
local_name,
195195
)
196196
.kind(CompletionItemKind::UnresolvedReference)
197-
.add_import(import_to_add)
197+
.add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately())
198198
.build();
199199
return Some(item);
200200
}
@@ -249,7 +249,7 @@ impl<'a> Render<'a> {
249249

250250
let item = item
251251
.kind(kind)
252-
.add_import(import_to_add)
252+
.add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately())
253253
.set_documentation(docs)
254254
.set_ref_match(ref_match)
255255
.build();

crates/completion/src/render/enum_variant.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ impl<'a> EnumVariantRender<'a> {
7171
.kind(CompletionItemKind::EnumVariant)
7272
.set_documentation(self.variant.docs(self.ctx.db()))
7373
.set_deprecated(self.ctx.is_deprecated(self.variant))
74-
.add_import(import_to_add)
74+
.add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately())
7575
.detail(self.detail());
7676

7777
if self.variant_kind == StructKind::Tuple {

crates/completion/src/render/function.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl<'a> FunctionRender<'a> {
4747
.set_deprecated(self.ctx.is_deprecated(self.func))
4848
.detail(self.detail())
4949
.add_call_parens(self.ctx.completion, self.name, params)
50-
.add_import(import_to_add)
50+
.add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately())
5151
.build()
5252
}
5353

crates/completion/src/render/macro_.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ impl<'a> MacroRender<'a> {
5050
.kind(CompletionItemKind::Macro)
5151
.set_documentation(self.docs.clone())
5252
.set_deprecated(self.ctx.is_deprecated(self.macro_))
53-
.add_import(import_to_add)
53+
.add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately())
5454
.detail(self.detail());
5555

5656
let needs_bang = self.needs_bang();

crates/completion/src/test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ pub(crate) fn check_edit_with_config(
9797
.unwrap_or_else(|| panic!("can't find {:?} completion in {:#?}", what, completions));
9898
let mut actual = db.file_text(position.file_id).to_string();
9999
completion.text_edit().apply(&mut actual);
100-
// TODO kb how to apply imports now?
100+
// git how to apply imports now?
101101
assert_eq_text!(&ra_fixture_after, &actual)
102102
}
103103

crates/rust-analyzer/src/handlers.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ pub(crate) fn handle_resolve_completion(
623623
for supported_completion_resolve_cap in &snap.config.completion.resolve_capabilities {
624624
match supported_completion_resolve_cap {
625625
ide::CompletionResolveCapability::AdditionalTextEdits => {
626-
// TODO kb actually add all additional edits here?
626+
// FIXME actually add all additional edits here?
627627
if let Some(import_to_add) = server_completion_data.item.import_to_add() {
628628
append_import_edits(
629629
&mut original_completion,
@@ -633,7 +633,7 @@ pub(crate) fn handle_resolve_completion(
633633
);
634634
}
635635
}
636-
// TODO kb calculate the rest also?
636+
// FIXME resolve the other capabilities also?
637637
_ => {}
638638
}
639639
}

0 commit comments

Comments
 (0)