From 7f450da39e24809a84b9ba9d4bea4fda07a74c30 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Sat, 2 Sep 2023 23:56:48 +0300 Subject: [PATCH] Omit hint resolve data better Omit sending inlay hint resolve data if inlay has no properties that client resolve capabilities support. --- crates/ide/src/inlay_hints.rs | 8 -------- crates/rust-analyzer/src/lsp/to_proto.rs | 23 ++++++++++++++--------- 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 { 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)> { - let res = match &*label.parts { +) -> Cancellable<(lsp_types::InlayHintLabel, Option, 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);