Skip to content

Commit 4261ac7

Browse files
Advertise completions and inlay hints resolve server capabilities based on the client capabilities.
1 parent aa38be8 commit 4261ac7

File tree

4 files changed

+45
-22
lines changed

4 files changed

+45
-22
lines changed

crates/ide-completion/src/lib.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use ide_db::{
1919
},
2020
items_locator,
2121
syntax_helpers::tree_diff::diff,
22-
FilePosition, RootDatabase,
22+
FilePosition, FxHashSet, RootDatabase,
2323
};
2424

2525
use crate::{
@@ -50,6 +50,18 @@ pub struct CompletionFieldsToResolve {
5050
}
5151

5252
impl CompletionFieldsToResolve {
53+
pub fn from_client_capabilities(client_capability_fields: &FxHashSet<&str>) -> Self {
54+
Self {
55+
resolve_label_details: client_capability_fields.contains("labelDetails"),
56+
resolve_tags: client_capability_fields.contains("tags"),
57+
resolve_detail: client_capability_fields.contains("detail"),
58+
resolve_documentation: client_capability_fields.contains("documentation"),
59+
resolve_filter_text: client_capability_fields.contains("filterText"),
60+
resolve_text_edit: client_capability_fields.contains("textEdit"),
61+
resolve_command: client_capability_fields.contains("command"),
62+
}
63+
}
64+
5365
pub const fn empty() -> Self {
5466
Self {
5567
resolve_label_details: false,

crates/ide/src/inlay_hints.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use hir::{
88
sym, ClosureStyle, HasVisibility, HirDisplay, HirDisplayError, HirWrite, ModuleDef,
99
ModuleDefId, Semantics,
1010
};
11-
use ide_db::text_edit::TextEdit;
1211
use ide_db::{famous_defs::FamousDefs, FileRange, RootDatabase};
12+
use ide_db::{text_edit::TextEdit, FxHashSet};
1313
use itertools::Itertools;
1414
use smallvec::{smallvec, SmallVec};
1515
use span::{Edition, EditionedFileId};
@@ -289,6 +289,16 @@ pub struct InlayFieldsToResolve {
289289
}
290290

291291
impl InlayFieldsToResolve {
292+
pub fn from_client_capabilities(client_capability_fields: &FxHashSet<&str>) -> Self {
293+
Self {
294+
resolve_text_edits: client_capability_fields.contains("textEdits"),
295+
resolve_hint_tooltip: client_capability_fields.contains("tooltip"),
296+
resolve_label_tooltip: client_capability_fields.contains("label.tooltip"),
297+
resolve_label_location: client_capability_fields.contains("label.location"),
298+
resolve_label_command: client_capability_fields.contains("label.command"),
299+
}
300+
}
301+
292302
pub const fn empty() -> Self {
293303
Self {
294304
resolve_text_edits: false,

crates/rust-analyzer/src/config.rs

+6-16
Original file line numberDiff line numberDiff line change
@@ -1446,15 +1446,9 @@ impl Config {
14461446
limit: self.completion_limit(source_root).to_owned(),
14471447
enable_term_search: self.completion_termSearch_enable(source_root).to_owned(),
14481448
term_search_fuel: self.completion_termSearch_fuel(source_root).to_owned() as u64,
1449-
fields_to_resolve: CompletionFieldsToResolve {
1450-
resolve_label_details: client_capability_fields.contains("labelDetails"),
1451-
resolve_tags: client_capability_fields.contains("tags"),
1452-
resolve_detail: client_capability_fields.contains("detail"),
1453-
resolve_documentation: client_capability_fields.contains("documentation"),
1454-
resolve_filter_text: client_capability_fields.contains("filterText"),
1455-
resolve_text_edit: client_capability_fields.contains("textEdit"),
1456-
resolve_command: client_capability_fields.contains("command"),
1457-
},
1449+
fields_to_resolve: CompletionFieldsToResolve::from_client_capabilities(
1450+
&client_capability_fields,
1451+
),
14581452
}
14591453
}
14601454

@@ -1614,13 +1608,9 @@ impl Config {
16141608
} else {
16151609
None
16161610
},
1617-
fields_to_resolve: InlayFieldsToResolve {
1618-
resolve_text_edits: client_capability_fields.contains("textEdits"),
1619-
resolve_hint_tooltip: client_capability_fields.contains("tooltip"),
1620-
resolve_label_tooltip: client_capability_fields.contains("label.tooltip"),
1621-
resolve_label_location: client_capability_fields.contains("label.location"),
1622-
resolve_label_command: client_capability_fields.contains("label.command"),
1623-
},
1611+
fields_to_resolve: InlayFieldsToResolve::from_client_capabilities(
1612+
&client_capability_fields,
1613+
),
16241614
implicit_drop_hints: self.inlayHints_implicitDrops_enable().to_owned(),
16251615
range_exclusive_hints: self.inlayHints_rangeExclusiveHints_enable().to_owned(),
16261616
}

crates/rust-analyzer/src/lsp/capabilities.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
//! Advertises the capabilities of the LSP Server.
2+
use ide::{CompletionFieldsToResolve, InlayFieldsToResolve};
23
use ide_db::{line_index::WideEncoding, FxHashSet};
34
use lsp_types::{
45
CallHierarchyServerCapability, CodeActionKind, CodeActionOptions, CodeActionProviderCapability,
@@ -40,7 +41,7 @@ pub fn server_capabilities(config: &Config) -> ServerCapabilities {
4041
})),
4142
hover_provider: Some(HoverProviderCapability::Simple(true)),
4243
completion_provider: Some(CompletionOptions {
43-
resolve_provider: config.caps().completions_resolve_provider(),
44+
resolve_provider: Some(config.caps().completions_resolve_provider()),
4445
trigger_characters: Some(vec![
4546
":".to_owned(),
4647
".".to_owned(),
@@ -136,7 +137,7 @@ pub fn server_capabilities(config: &Config) -> ServerCapabilities {
136137
inlay_hint_provider: Some(OneOf::Right(InlayHintServerCapabilities::Options(
137138
InlayHintOptions {
138139
work_done_progress_options: Default::default(),
139-
resolve_provider: Some(true),
140+
resolve_provider: Some(config.caps().inlay_hints_resolve_provider()),
140141
},
141142
))),
142143
inline_value_provider: None,
@@ -176,8 +177,18 @@ impl ClientCapabilities {
176177
Self(caps)
177178
}
178179

179-
fn completions_resolve_provider(&self) -> Option<bool> {
180-
self.completion_item_edit_resolve().then_some(true)
180+
fn completions_resolve_provider(&self) -> bool {
181+
let client_capabilities = self.completion_resolve_support_properties();
182+
let fields_to_resolve =
183+
CompletionFieldsToResolve::from_client_capabilities(&client_capabilities);
184+
fields_to_resolve != CompletionFieldsToResolve::empty()
185+
}
186+
187+
fn inlay_hints_resolve_provider(&self) -> bool {
188+
let client_capabilities = self.inlay_hint_resolve_support_properties();
189+
let fields_to_resolve =
190+
InlayFieldsToResolve::from_client_capabilities(&client_capabilities);
191+
fields_to_resolve != InlayFieldsToResolve::empty()
181192
}
182193

183194
fn experimental_bool(&self, index: &'static str) -> bool {

0 commit comments

Comments
 (0)