Properly fill client completion resolve capabilities data

This commit is contained in:
Kirill Bulatov 2020-12-01 22:46:06 +02:00
parent 9a4daffe16
commit 47464e556c
5 changed files with 56 additions and 5 deletions

View 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 @@ impl Default for CompletionConfig {
add_call_argument_snippets: true,
snippet_cap: Some(SnippetCap { _private: () }),
merge: Some(MergeBehaviour::Full),
resolve_capabilities: FxHashSet::default(),
}
}
}

View file

@ -17,7 +17,7 @@ use ide_db::RootDatabase;
use crate::{completions::Completions, context::CompletionContext, item::CompletionKind};
pub use crate::{
config::CompletionConfig,
config::{CompletionConfig, CompletionResolveCapability},
item::{CompletionItem, CompletionItemKind, CompletionScore, ImportToAdd, InsertTextFormat},
};

View file

@ -80,8 +80,8 @@ pub use crate::{
},
};
pub use completion::{
CompletionConfig, CompletionItem, CompletionItemKind, CompletionScore, ImportToAdd,
InsertTextFormat,
CompletionConfig, CompletionItem, CompletionItemKind, CompletionResolveCapability,
CompletionScore, ImportToAdd, InsertTextFormat,
};
pub use ide_db::{
call_info::CallInfo,

View 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 @@ use lsp_types::{
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

View file

@ -19,7 +19,7 @@ use rustc_hash::FxHashSet;
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 @@ impl Config {
}
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 {