From 50e06ee95ab12bc204fdce557ab0fb7aa5e5ab2f Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 3 Dec 2020 00:13:32 +0200 Subject: Refactor the code --- crates/completion/src/config.rs | 9 ++++++++- crates/completion/src/item.rs | 3 +-- crates/completion/src/render.rs | 10 ++++++++-- crates/completion/src/render/enum_variant.rs | 5 ++++- crates/completion/src/render/function.rs | 5 ++++- crates/completion/src/render/macro_.rs | 5 ++++- crates/completion/src/test_utils.rs | 1 - 7 files changed, 29 insertions(+), 9 deletions(-) (limited to 'crates/completion/src') diff --git a/crates/completion/src/config.rs b/crates/completion/src/config.rs index e9a02aeb8..f2fa5c27b 100644 --- a/crates/completion/src/config.rs +++ b/crates/completion/src/config.rs @@ -15,9 +15,15 @@ pub struct CompletionConfig { pub add_call_argument_snippets: bool, pub snippet_cap: Option, pub merge: Option, + /// A set of capabilities, enabled on the cliend and supported on the server. pub resolve_capabilities: FxHashSet, } +/// A resolve capability, supported on a server. +/// If the client registers any of those in its completion resolve capabilities, +/// the server is able to render completion items' corresponding fields later, +/// not during an initial completion item request. +/// See https://github.com/rust-analyzer/rust-analyzer/issues/6366 for more details. #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)] pub enum CompletionResolveCapability { Documentation, @@ -30,7 +36,8 @@ impl CompletionConfig { self.snippet_cap = if yes { Some(SnippetCap { _private: () }) } else { None } } - pub fn should_resolve_immediately(&self) -> bool { + /// Whether the completions' additional edits are calculated later, during a resolve request or not. + pub fn should_resolve_additional_edits_immediately(&self) -> bool { !self.resolve_capabilities.contains(&CompletionResolveCapability::AdditionalTextEdits) } } diff --git a/crates/completion/src/item.rs b/crates/completion/src/item.rs index 5906637a6..775245b3b 100644 --- a/crates/completion/src/item.rs +++ b/crates/completion/src/item.rs @@ -67,8 +67,7 @@ pub struct CompletionItem { /// possible match. ref_match: Option<(Mutability, CompletionScore)>, - /// The data later to be used in the `completionItem/resolve` response - /// to add the insert import edit. + /// The import data to add to completion's edits. import_to_add: Option, } diff --git a/crates/completion/src/render.rs b/crates/completion/src/render.rs index b7a3a3935..3a793000b 100644 --- a/crates/completion/src/render.rs +++ b/crates/completion/src/render.rs @@ -194,7 +194,10 @@ impl<'a> Render<'a> { local_name, ) .kind(CompletionItemKind::UnresolvedReference) - .add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately()) + .add_import( + import_to_add, + self.ctx.completion.config.should_resolve_additional_edits_immediately(), + ) .build(); return Some(item); } @@ -249,7 +252,10 @@ impl<'a> Render<'a> { let item = item .kind(kind) - .add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately()) + .add_import( + import_to_add, + self.ctx.completion.config.should_resolve_additional_edits_immediately(), + ) .set_documentation(docs) .set_ref_match(ref_match) .build(); diff --git a/crates/completion/src/render/enum_variant.rs b/crates/completion/src/render/enum_variant.rs index c08824c6a..6548b4676 100644 --- a/crates/completion/src/render/enum_variant.rs +++ b/crates/completion/src/render/enum_variant.rs @@ -71,7 +71,10 @@ impl<'a> EnumVariantRender<'a> { .kind(CompletionItemKind::EnumVariant) .set_documentation(self.variant.docs(self.ctx.db())) .set_deprecated(self.ctx.is_deprecated(self.variant)) - .add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately()) + .add_import( + import_to_add, + self.ctx.completion.config.should_resolve_additional_edits_immediately(), + ) .detail(self.detail()); if self.variant_kind == StructKind::Tuple { diff --git a/crates/completion/src/render/function.rs b/crates/completion/src/render/function.rs index 3492384c6..b13e0dafc 100644 --- a/crates/completion/src/render/function.rs +++ b/crates/completion/src/render/function.rs @@ -47,7 +47,10 @@ impl<'a> FunctionRender<'a> { .set_deprecated(self.ctx.is_deprecated(self.func)) .detail(self.detail()) .add_call_parens(self.ctx.completion, self.name, params) - .add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately()) + .add_import( + import_to_add, + self.ctx.completion.config.should_resolve_additional_edits_immediately(), + ) .build() } diff --git a/crates/completion/src/render/macro_.rs b/crates/completion/src/render/macro_.rs index 15648b5b7..7a8eeb7b9 100644 --- a/crates/completion/src/render/macro_.rs +++ b/crates/completion/src/render/macro_.rs @@ -50,7 +50,10 @@ impl<'a> MacroRender<'a> { .kind(CompletionItemKind::Macro) .set_documentation(self.docs.clone()) .set_deprecated(self.ctx.is_deprecated(self.macro_)) - .add_import(import_to_add, self.ctx.completion.config.should_resolve_immediately()) + .add_import( + import_to_add, + self.ctx.completion.config.should_resolve_additional_edits_immediately(), + ) .detail(self.detail()); let needs_bang = self.needs_bang(); diff --git a/crates/completion/src/test_utils.rs b/crates/completion/src/test_utils.rs index 88351ee15..4c1b1a839 100644 --- a/crates/completion/src/test_utils.rs +++ b/crates/completion/src/test_utils.rs @@ -97,7 +97,6 @@ pub(crate) fn check_edit_with_config( .unwrap_or_else(|| panic!("can't find {:?} completion in {:#?}", what, completions)); let mut actual = db.file_text(position.file_id).to_string(); completion.text_edit().apply(&mut actual); - // git how to apply imports now? assert_eq_text!(&ra_fixture_after, &actual) } -- cgit v1.2.3