diff options
| author | Aleksey Kladov <aleksey.kladov@gmail.com> | 2021-01-06 20:23:53 +0300 |
|---|---|---|
| committer | Aleksey Kladov <aleksey.kladov@gmail.com> | 2021-01-06 20:23:53 +0300 |
| commit | 6e87828756d970e9c25635aa9f71f0a90cc8ff65 (patch) | |
| tree | 5d35a8f66b79103cb50a6174b015907d0c65a231 /crates/rust-analyzer/src | |
| parent | edf03548e365f2ebd89517713aac9b531b43ed24 (diff) | |
| download | rust-6e87828756d970e9c25635aa9f71f0a90cc8ff65.tar.gz rust-6e87828756d970e9c25635aa9f71f0a90cc8ff65.zip | |
YAGNI active_resolve_capabilities
This leaks a lot of LSP details into ide layer, which we want to avoid: https://github.com/rust-analyzer/rust-analyzer/tree/c9cec381bcfd97e5f3536e31a9c546ab5c0665e6/docs/dev#lsp-independence Additionally, all what this infra does is providing a toggle for auto-import completion, but we already have one!
Diffstat (limited to 'crates/rust-analyzer/src')
| -rw-r--r-- | crates/rust-analyzer/src/caps.rs | 46 | ||||
| -rw-r--r-- | crates/rust-analyzer/src/config.rs | 7 | ||||
| -rw-r--r-- | crates/rust-analyzer/src/handlers.rs | 21 |
3 files changed, 27 insertions, 47 deletions
diff --git a/crates/rust-analyzer/src/caps.rs b/crates/rust-analyzer/src/caps.rs index 80e46bf7f15..3db0d55c5a8 100644 --- a/crates/rust-analyzer/src/caps.rs +++ b/crates/rust-analyzer/src/caps.rs @@ -1,7 +1,6 @@ //! Advertizes the capabilities of the LSP Server. use std::env; -use ide::CompletionResolveCapability; use lsp_types::{ CallHierarchyServerCapability, ClientCapabilities, CodeActionKind, CodeActionOptions, CodeActionProviderCapability, CodeLensOptions, CompletionOptions, @@ -14,7 +13,6 @@ use lsp_types::{ WorkDoneProgressOptions, WorkspaceFileOperationsServerCapabilities, WorkspaceServerCapabilities, }; -use rustc_hash::FxHashSet; use serde_json::json; use crate::semantic_tokens; @@ -118,37 +116,31 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti } fn completions_resolve_provider(client_caps: &ClientCapabilities) -> Option<bool> { - if enabled_completions_resolve_capabilities(client_caps)?.is_empty() { + if completion_item_edit_resolve(client_caps) { + Some(true) + } else { log::info!("No `additionalTextEdits` completion resolve capability was found in the client capabilities, autoimport completion is disabled"); None - } else { - Some(true) } } /// Parses client capabilities and returns all completion resolve capabilities rust-analyzer supports. -pub(crate) fn enabled_completions_resolve_capabilities( - caps: &ClientCapabilities, -) -> Option<FxHashSet<CompletionResolveCapability>> { - Some( - caps.text_document - .as_ref()? - .completion - .as_ref()? - .completion_item - .as_ref()? - .resolve_support - .as_ref()? - .properties - .iter() - .filter_map(|cap_string| match cap_string.as_str() { - "additionalTextEdits" => Some(CompletionResolveCapability::AdditionalTextEdits), - "detail" => Some(CompletionResolveCapability::Detail), - "documentation" => Some(CompletionResolveCapability::Documentation), - _unsupported => None, - }) - .collect(), - ) +pub(crate) fn completion_item_edit_resolve(caps: &ClientCapabilities) -> bool { + (|| { + Some( + caps.text_document + .as_ref()? + .completion + .as_ref()? + .completion_item + .as_ref()? + .resolve_support + .as_ref()? + .properties + .iter() + .any(|cap_string| cap_string.as_str() == "additionalTextEdits"), + ) + })() == Some(true) } fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProviderCapability { diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 24e7936fc9e..ce952631569 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -20,7 +20,7 @@ use rustc_hash::FxHashSet; use serde::{de::DeserializeOwned, Deserialize}; use vfs::AbsPathBuf; -use crate::{caps::enabled_completions_resolve_capabilities, diagnostics::DiagnosticsMapConfig}; +use crate::{caps::completion_item_edit_resolve, diagnostics::DiagnosticsMapConfig}; config_data! { struct ConfigData { @@ -536,12 +536,11 @@ impl Config { pub fn completion(&self) -> CompletionConfig { let mut res = CompletionConfig::default(); res.enable_postfix_completions = self.data.completion_postfix_enable; - res.enable_autoimport_completions = self.data.completion_autoimport_enable; + res.enable_autoimport_completions = + self.data.completion_autoimport_enable && completion_item_edit_resolve(&self.caps); res.add_call_parenthesis = self.data.completion_addCallParenthesis; res.add_call_argument_snippets = self.data.completion_addCallArgumentSnippets; res.merge = self.merge_behavior(); - res.active_resolve_capabilities = - enabled_completions_resolve_capabilities(&self.caps).unwrap_or_default(); res.allow_snippets(try_or!( self.caps diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 33661325a4d..a7bf0ec6a82 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -9,9 +9,8 @@ use std::{ }; use ide::{ - CompletionResolveCapability, FileId, FilePosition, FileRange, HoverAction, HoverGotoTypeData, - LineIndex, NavigationTarget, Query, RangeInfo, Runnable, RunnableKind, SearchScope, - SourceChange, SymbolKind, TextEdit, + FileId, FilePosition, FileRange, HoverAction, HoverGotoTypeData, LineIndex, NavigationTarget, + Query, RangeInfo, Runnable, RunnableKind, SearchScope, SourceChange, SymbolKind, TextEdit, }; use itertools::Itertools; use lsp_server::ErrorCode; @@ -634,10 +633,9 @@ pub(crate) fn handle_completion( let mut new_completion_items = to_proto::completion_item(&line_index, line_endings, item.clone()); - if completion_config.resolve_additional_edits_lazily() { + if completion_config.enable_autoimport_completions { for new_item in &mut new_completion_items { - let _ = fill_resolve_data(&mut new_item.data, &item, &text_document_position) - .take(); + fill_resolve_data(&mut new_item.data, &item, &text_document_position); } } @@ -663,15 +661,6 @@ pub(crate) fn handle_completion_resolve( .into()); } - // FIXME resolve the other capabilities also? - let completion_config = &snap.config.completion(); - if !completion_config - .active_resolve_capabilities - .contains(&CompletionResolveCapability::AdditionalTextEdits) - { - return Ok(original_completion); - } - let resolve_data = match original_completion .data .take() @@ -690,7 +679,7 @@ pub(crate) fn handle_completion_resolve( let additional_edits = snap .analysis .resolve_completion_edits( - &completion_config, + &snap.config.completion(), FilePosition { file_id, offset }, &resolve_data.full_import_path, resolve_data.imported_name, |
