Skip to content

Commit 47464e5

Browse files
Properly fill client completion resolve capabilities data
1 parent 9a4daff commit 47464e5

File tree

5 files changed

+56
-5
lines changed

5 files changed

+56
-5
lines changed

crates/completion/src/config.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
//! completions if we are allowed to.
66
77
use ide_db::helpers::insert_use::MergeBehaviour;
8+
use rustc_hash::FxHashSet;
89

910
#[derive(Clone, Debug, PartialEq, Eq)]
1011
pub struct CompletionConfig {
@@ -14,6 +15,14 @@ pub struct CompletionConfig {
1415
pub add_call_argument_snippets: bool,
1516
pub snippet_cap: Option<SnippetCap>,
1617
pub merge: Option<MergeBehaviour>,
18+
pub resolve_capabilities: FxHashSet<CompletionResolveCapability>,
19+
}
20+
21+
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
22+
pub enum CompletionResolveCapability {
23+
Documentation,
24+
Detail,
25+
AdditionalTextEdits,
1726
}
1827

1928
impl CompletionConfig {
@@ -36,6 +45,7 @@ impl Default for CompletionConfig {
3645
add_call_argument_snippets: true,
3746
snippet_cap: Some(SnippetCap { _private: () }),
3847
merge: Some(MergeBehaviour::Full),
48+
resolve_capabilities: FxHashSet::default(),
3949
}
4050
}
4151
}

crates/completion/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use ide_db::RootDatabase;
1717
use crate::{completions::Completions, context::CompletionContext, item::CompletionKind};
1818

1919
pub use crate::{
20-
config::CompletionConfig,
20+
config::{CompletionConfig, CompletionResolveCapability},
2121
item::{CompletionItem, CompletionItemKind, CompletionScore, ImportToAdd, InsertTextFormat},
2222
};
2323

crates/ide/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ pub use crate::{
8080
},
8181
};
8282
pub use completion::{
83-
CompletionConfig, CompletionItem, CompletionItemKind, CompletionScore, ImportToAdd,
84-
InsertTextFormat,
83+
CompletionConfig, CompletionItem, CompletionItemKind, CompletionResolveCapability,
84+
CompletionScore, ImportToAdd, InsertTextFormat,
8585
};
8686
pub use ide_db::{
8787
call_info::CallInfo,

crates/rust-analyzer/src/caps.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Advertizes the capabilities of the LSP Server.
22
use std::env;
33

4+
use ide::CompletionResolveCapability;
45
use lsp_types::{
56
CallHierarchyServerCapability, ClientCapabilities, CodeActionKind, CodeActionOptions,
67
CodeActionProviderCapability, CodeLensOptions, CompletionOptions,
@@ -11,6 +12,7 @@ use lsp_types::{
1112
TextDocumentSyncKind, TextDocumentSyncOptions, TypeDefinitionProviderCapability,
1213
WorkDoneProgressOptions,
1314
};
15+
use rustc_hash::FxHashSet;
1416
use serde_json::json;
1517

1618
use crate::semantic_tokens;
@@ -48,7 +50,9 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti
4850
document_symbol_provider: Some(OneOf::Left(true)),
4951
workspace_symbol_provider: Some(OneOf::Left(true)),
5052
code_action_provider: Some(code_action_capabilities(client_caps)),
51-
code_lens_provider: Some(CodeLensOptions { resolve_provider: Some(true) }),
53+
code_lens_provider: Some(CodeLensOptions {
54+
resolve_provider: resolve_provider(client_caps),
55+
}),
5256
document_formatting_provider: Some(OneOf::Left(true)),
5357
document_range_formatting_provider: None,
5458
document_on_type_formatting_provider: Some(DocumentOnTypeFormattingOptions {
@@ -93,6 +97,41 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti
9397
}
9498
}
9599

100+
fn resolve_provider(client_caps: &ClientCapabilities) -> Option<bool> {
101+
if enabled_resolve_capabilities(client_caps)?.is_empty() {
102+
None
103+
} else {
104+
Some(true)
105+
}
106+
}
107+
108+
/// Parses client capabilities and returns all that rust-analyzer supports.
109+
pub fn enabled_resolve_capabilities(
110+
caps: &ClientCapabilities,
111+
) -> Option<FxHashSet<CompletionResolveCapability>> {
112+
Some(
113+
caps.text_document
114+
.as_ref()?
115+
.completion
116+
.as_ref()?
117+
.completion_item
118+
.as_ref()?
119+
.resolve_support
120+
.as_ref()?
121+
.properties
122+
.iter()
123+
.filter_map(|cap_string| {
124+
Some(match cap_string.as_str() {
125+
"additionalTextEdits" => CompletionResolveCapability::AdditionalTextEdits,
126+
"detail" => CompletionResolveCapability::Detail,
127+
"documentation" => CompletionResolveCapability::Documentation,
128+
_unsupported => return None,
129+
})
130+
})
131+
.collect(),
132+
)
133+
}
134+
96135
fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProviderCapability {
97136
client_caps
98137
.text_document

crates/rust-analyzer/src/config.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use rustc_hash::FxHashSet;
1919
use serde::Deserialize;
2020
use vfs::AbsPathBuf;
2121

22-
use crate::diagnostics::DiagnosticsMapConfig;
22+
use crate::{caps::enabled_resolve_capabilities, diagnostics::DiagnosticsMapConfig};
2323

2424
#[derive(Debug, Clone)]
2525
pub struct Config {
@@ -388,6 +388,8 @@ impl Config {
388388
}
389389

390390
self.completion.allow_snippets(false);
391+
self.completion.resolve_capabilities =
392+
enabled_resolve_capabilities(caps).unwrap_or_default();
391393
if let Some(completion) = &doc_caps.completion {
392394
if let Some(completion_item) = &completion.completion_item {
393395
if let Some(value) = completion_item.snippet_support {

0 commit comments

Comments
 (0)