//! 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 {
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 {
add_call_argument_snippets: true,
snippet_cap: Some(SnippetCap { _private: () }),
merge: Some(MergeBehaviour::Full),
+ resolve_capabilities: FxHashSet::default(),
}
}
}
use crate::{completions::Completions, context::CompletionContext, item::CompletionKind};
pub use crate::{
- config::CompletionConfig,
+ config::{CompletionConfig, CompletionResolveCapability},
item::{CompletionItem, CompletionItemKind, CompletionScore, ImportToAdd, InsertTextFormat},
};
},
};
pub use completion::{
- CompletionConfig, CompletionItem, CompletionItemKind, CompletionScore, ImportToAdd,
- InsertTextFormat,
+ CompletionConfig, CompletionItem, CompletionItemKind, CompletionResolveCapability,
+ CompletionScore, ImportToAdd, InsertTextFormat,
};
pub use ide_db::{
call_info::CallInfo,
//! Advertizes the capabilities of the LSP Server.
use std::env;
+use ide::CompletionResolveCapability;
use lsp_types::{
CallHierarchyServerCapability, ClientCapabilities, CodeActionKind, CodeActionOptions,
CodeActionProviderCapability, CodeLensOptions, CompletionOptions,
TextDocumentSyncKind, TextDocumentSyncOptions, TypeDefinitionProviderCapability,
WorkDoneProgressOptions,
};
+use rustc_hash::FxHashSet;
use serde_json::json;
use crate::semantic_tokens;
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 {
}
}
+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
use serde::Deserialize;
use vfs::AbsPathBuf;
-use crate::diagnostics::DiagnosticsMapConfig;
+use crate::{caps::enabled_resolve_capabilities, diagnostics::DiagnosticsMapConfig};
#[derive(Debug, Clone)]
pub struct 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 {