Unnamed repository; edit this file 'description' to name the repository.
Omit hint resolve data better
Omit sending inlay hint resolve data if inlay has no properties that client resolve capabilities support.
Kirill Bulatov 2023-09-03
parent 7b3dba5 · commit 7f450da
-rw-r--r--crates/ide/src/inlay_hints.rs8
-rw-r--r--crates/rust-analyzer/src/lsp/to_proto.rs23
2 files changed, 14 insertions, 17 deletions
diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs
index 78c177ccbe..a5d070fe76 100644
--- a/crates/ide/src/inlay_hints.rs
+++ b/crates/ide/src/inlay_hints.rs
@@ -74,14 +74,6 @@ impl InlayFieldsToResolve {
resolve_label_command: false,
}
}
-
- pub fn can_resolve(&self) -> bool {
- self.resolve_text_edits
- || self.resolve_hint_tooltip
- || self.resolve_label_tooltip
- || self.resolve_label_location
- || self.resolve_label_command
- }
}
#[derive(Clone, Debug, PartialEq, Eq)]
diff --git a/crates/rust-analyzer/src/lsp/to_proto.rs b/crates/rust-analyzer/src/lsp/to_proto.rs
index 753ae167df..c81d72b5f1 100644
--- a/crates/rust-analyzer/src/lsp/to_proto.rs
+++ b/crates/rust-analyzer/src/lsp/to_proto.rs
@@ -443,18 +443,19 @@ pub(crate) fn inlay_hint(
inlay_hint: InlayHint,
) -> Cancellable<lsp_types::InlayHint> {
let needs_resolve = inlay_hint.needs_resolve;
- let (label, tooltip) =
+ let (label, tooltip, mut something_to_resolve) =
inlay_hint_label(snap, fields_to_resolve, needs_resolve, inlay_hint.label)?;
- let data = if needs_resolve && fields_to_resolve.can_resolve() {
- Some(to_value(lsp_ext::InlayHintResolveData { file_id: file_id.0 }).unwrap())
- } else {
- None
- };
let text_edits = if needs_resolve && fields_to_resolve.resolve_text_edits {
+ something_to_resolve |= inlay_hint.text_edit.is_some();
None
} else {
inlay_hint.text_edit.map(|it| text_edit_vec(line_index, it))
};
+ let data = if needs_resolve && something_to_resolve {
+ Some(to_value(lsp_ext::InlayHintResolveData { file_id: file_id.0 }).unwrap())
+ } else {
+ None
+ };
Ok(lsp_types::InlayHint {
position: match inlay_hint.position {
@@ -480,11 +481,13 @@ fn inlay_hint_label(
fields_to_resolve: &InlayFieldsToResolve,
needs_resolve: bool,
mut label: InlayHintLabel,
-) -> Cancellable<(lsp_types::InlayHintLabel, Option<lsp_types::InlayHintTooltip>)> {
- let res = match &*label.parts {
+) -> Cancellable<(lsp_types::InlayHintLabel, Option<lsp_types::InlayHintTooltip>, bool)> {
+ let mut something_to_resolve = false;
+ let (label, tooltip) = match &*label.parts {
[InlayHintLabelPart { linked_location: None, .. }] => {
let InlayHintLabelPart { text, tooltip, .. } = label.parts.pop().unwrap();
let hint_tooltip = if needs_resolve && fields_to_resolve.resolve_hint_tooltip {
+ something_to_resolve |= tooltip.is_some();
None
} else {
match tooltip {
@@ -508,6 +511,7 @@ fn inlay_hint_label(
.into_iter()
.map(|part| {
let tooltip = if needs_resolve && fields_to_resolve.resolve_label_tooltip {
+ something_to_resolve |= part.tooltip.is_some();
None
} else {
match part.tooltip {
@@ -526,6 +530,7 @@ fn inlay_hint_label(
}
};
let location = if needs_resolve && fields_to_resolve.resolve_label_location {
+ something_to_resolve |= part.linked_location.is_some();
None
} else {
part.linked_location.map(|range| location(snap, range)).transpose()?
@@ -541,7 +546,7 @@ fn inlay_hint_label(
(lsp_types::InlayHintLabel::LabelParts(parts), None)
}
};
- Ok(res)
+ Ok((label, tooltip, something_to_resolve))
}
static TOKEN_RESULT_COUNTER: AtomicU32 = AtomicU32::new(1);