]> git.lizzy.rs Git - rust.git/commitdiff
Properly fill client completion resolve capabilities data
authorKirill Bulatov <mail4score@gmail.com>
Tue, 1 Dec 2020 20:46:06 +0000 (22:46 +0200)
committerKirill Bulatov <mail4score@gmail.com>
Mon, 7 Dec 2020 21:41:08 +0000 (23:41 +0200)
crates/completion/src/config.rs
crates/completion/src/lib.rs
crates/ide/src/lib.rs
crates/rust-analyzer/src/caps.rs
crates/rust-analyzer/src/config.rs

index 654a76f7b33e2077247a90e431e250674d1e6225..736af455ef0b0217f76a076b26685ea33a5eb8e2 100644 (file)
@@ -5,6 +5,7 @@
 //! completions if we are allowed to.
 
 use ide_db::helpers::insert_use::MergeBehaviour;
+use rustc_hash::FxHashSet;
 
 #[derive(Clone, Debug, PartialEq, Eq)]
 pub struct CompletionConfig {
@@ -14,6 +15,14 @@ pub struct CompletionConfig {
     pub add_call_argument_snippets: bool,
     pub snippet_cap: Option<SnippetCap>,
     pub merge: Option<MergeBehaviour>,
+    pub resolve_capabilities: FxHashSet<CompletionResolveCapability>,
+}
+
+#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
+pub enum CompletionResolveCapability {
+    Documentation,
+    Detail,
+    AdditionalTextEdits,
 }
 
 impl CompletionConfig {
@@ -36,6 +45,7 @@ fn default() -> Self {
             add_call_argument_snippets: true,
             snippet_cap: Some(SnippetCap { _private: () }),
             merge: Some(MergeBehaviour::Full),
+            resolve_capabilities: FxHashSet::default(),
         }
     }
 }
index 28209d4e0a9e479eb61719b300327da5dd56b36a..c689b0ddee57b36c6fd3f5de41be29346c021ff9 100644 (file)
@@ -17,7 +17,7 @@
 use crate::{completions::Completions, context::CompletionContext, item::CompletionKind};
 
 pub use crate::{
-    config::CompletionConfig,
+    config::{CompletionConfig, CompletionResolveCapability},
     item::{CompletionItem, CompletionItemKind, CompletionScore, ImportToAdd, InsertTextFormat},
 };
 
index 7015a512680b6fdb5709b3d08cd18a80797975d2..d1a27f3a599568a688dd751d78ef94298df9324b 100644 (file)
@@ -80,8 +80,8 @@ macro_rules! eprintln {
     },
 };
 pub use completion::{
-    CompletionConfig, CompletionItem, CompletionItemKind, CompletionScore, ImportToAdd,
-    InsertTextFormat,
+    CompletionConfig, CompletionItem, CompletionItemKind, CompletionResolveCapability,
+    CompletionScore, ImportToAdd, InsertTextFormat,
 };
 pub use ide_db::{
     call_info::CallInfo,
index c559e1a3d6f8aa80ff3d4ce16236ebc20a8e2d60..d6b862088b280f7f6477083bfa1c0978fbd59f8b 100644 (file)
@@ -1,6 +1,7 @@
 //! Advertizes the capabilities of the LSP Server.
 use std::env;
 
+use ide::CompletionResolveCapability;
 use lsp_types::{
     CallHierarchyServerCapability, ClientCapabilities, CodeActionKind, CodeActionOptions,
     CodeActionProviderCapability, CodeLensOptions, CompletionOptions,
@@ -11,6 +12,7 @@
     TextDocumentSyncKind, TextDocumentSyncOptions, TypeDefinitionProviderCapability,
     WorkDoneProgressOptions,
 };
+use rustc_hash::FxHashSet;
 use serde_json::json;
 
 use crate::semantic_tokens;
@@ -48,7 +50,9 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti
         document_symbol_provider: Some(OneOf::Left(true)),
         workspace_symbol_provider: Some(OneOf::Left(true)),
         code_action_provider: Some(code_action_capabilities(client_caps)),
-        code_lens_provider: Some(CodeLensOptions { resolve_provider: Some(true) }),
+        code_lens_provider: Some(CodeLensOptions {
+            resolve_provider: resolve_provider(client_caps),
+        }),
         document_formatting_provider: Some(OneOf::Left(true)),
         document_range_formatting_provider: None,
         document_on_type_formatting_provider: Some(DocumentOnTypeFormattingOptions {
@@ -93,6 +97,41 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti
     }
 }
 
+fn resolve_provider(client_caps: &ClientCapabilities) -> Option<bool> {
+    if enabled_resolve_capabilities(client_caps)?.is_empty() {
+        None
+    } else {
+        Some(true)
+    }
+}
+
+/// Parses client capabilities and returns all that rust-analyzer supports.
+pub fn enabled_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| {
+                Some(match cap_string.as_str() {
+                    "additionalTextEdits" => CompletionResolveCapability::AdditionalTextEdits,
+                    "detail" => CompletionResolveCapability::Detail,
+                    "documentation" => CompletionResolveCapability::Documentation,
+                    _unsupported => return None,
+                })
+            })
+            .collect(),
+    )
+}
+
 fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProviderCapability {
     client_caps
         .text_document
index 59269a74b918f72cff7218c72c1a23d84dd59c54..83f09782969d68857aabd75172e0d3d31a815da1 100644 (file)
@@ -19,7 +19,7 @@
 use serde::Deserialize;
 use vfs::AbsPathBuf;
 
-use crate::diagnostics::DiagnosticsMapConfig;
+use crate::{caps::enabled_resolve_capabilities, diagnostics::DiagnosticsMapConfig};
 
 #[derive(Debug, Clone)]
 pub struct Config {
@@ -388,6 +388,8 @@ pub fn update_caps(&mut self, caps: &ClientCapabilities) {
             }
 
             self.completion.allow_snippets(false);
+            self.completion.resolve_capabilities =
+                enabled_resolve_capabilities(caps).unwrap_or_default();
             if let Some(completion) = &doc_caps.completion {
                 if let Some(completion_item) = &completion.completion_item {
                     if let Some(value) = completion_item.snippet_support {