about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKirill Bulatov <mail4score@gmail.com>2023-09-02 23:56:48 +0300
committerKirill Bulatov <mail4score@gmail.com>2023-09-02 23:56:48 +0300
commit7f450da39e24809a84b9ba9d4bea4fda07a74c30 (patch)
treebc7ad65236b1ce978edf1541442b4bce09ed5131
parent7b3dba5d770c157411c1be6cf3caeaab37bdc244 (diff)
downloadrust-7f450da39e24809a84b9ba9d4bea4fda07a74c30.tar.gz
rust-7f450da39e24809a84b9ba9d4bea4fda07a74c30.zip
Omit hint resolve data better
Omit sending inlay hint resolve data if inlay has no properties that
client resolve capabilities support.
-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 78c177ccbef..a5d070fe767 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 753ae167df1..c81d72b5f14 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);