Skip to content

Commit 7f450da

Browse files
Omit hint resolve data better
Omit sending inlay hint resolve data if inlay has no properties that client resolve capabilities support.
1 parent 7b3dba5 commit 7f450da

File tree

2 files changed

+14
-17
lines changed

2 files changed

+14
-17
lines changed

crates/ide/src/inlay_hints.rs

-8
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,6 @@ impl InlayFieldsToResolve {
7474
resolve_label_command: false,
7575
}
7676
}
77-
78-
pub fn can_resolve(&self) -> bool {
79-
self.resolve_text_edits
80-
|| self.resolve_hint_tooltip
81-
|| self.resolve_label_tooltip
82-
|| self.resolve_label_location
83-
|| self.resolve_label_command
84-
}
8577
}
8678

8779
#[derive(Clone, Debug, PartialEq, Eq)]

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

+14-9
Original file line numberDiff line numberDiff line change
@@ -443,18 +443,19 @@ pub(crate) fn inlay_hint(
443443
inlay_hint: InlayHint,
444444
) -> Cancellable<lsp_types::InlayHint> {
445445
let needs_resolve = inlay_hint.needs_resolve;
446-
let (label, tooltip) =
446+
let (label, tooltip, mut something_to_resolve) =
447447
inlay_hint_label(snap, fields_to_resolve, needs_resolve, inlay_hint.label)?;
448-
let data = if needs_resolve && fields_to_resolve.can_resolve() {
449-
Some(to_value(lsp_ext::InlayHintResolveData { file_id: file_id.0 }).unwrap())
450-
} else {
451-
None
452-
};
453448
let text_edits = if needs_resolve && fields_to_resolve.resolve_text_edits {
449+
something_to_resolve |= inlay_hint.text_edit.is_some();
454450
None
455451
} else {
456452
inlay_hint.text_edit.map(|it| text_edit_vec(line_index, it))
457453
};
454+
let data = if needs_resolve && something_to_resolve {
455+
Some(to_value(lsp_ext::InlayHintResolveData { file_id: file_id.0 }).unwrap())
456+
} else {
457+
None
458+
};
458459

459460
Ok(lsp_types::InlayHint {
460461
position: match inlay_hint.position {
@@ -480,11 +481,13 @@ fn inlay_hint_label(
480481
fields_to_resolve: &InlayFieldsToResolve,
481482
needs_resolve: bool,
482483
mut label: InlayHintLabel,
483-
) -> Cancellable<(lsp_types::InlayHintLabel, Option<lsp_types::InlayHintTooltip>)> {
484-
let res = match &*label.parts {
484+
) -> Cancellable<(lsp_types::InlayHintLabel, Option<lsp_types::InlayHintTooltip>, bool)> {
485+
let mut something_to_resolve = false;
486+
let (label, tooltip) = match &*label.parts {
485487
[InlayHintLabelPart { linked_location: None, .. }] => {
486488
let InlayHintLabelPart { text, tooltip, .. } = label.parts.pop().unwrap();
487489
let hint_tooltip = if needs_resolve && fields_to_resolve.resolve_hint_tooltip {
490+
something_to_resolve |= tooltip.is_some();
488491
None
489492
} else {
490493
match tooltip {
@@ -508,6 +511,7 @@ fn inlay_hint_label(
508511
.into_iter()
509512
.map(|part| {
510513
let tooltip = if needs_resolve && fields_to_resolve.resolve_label_tooltip {
514+
something_to_resolve |= part.tooltip.is_some();
511515
None
512516
} else {
513517
match part.tooltip {
@@ -526,6 +530,7 @@ fn inlay_hint_label(
526530
}
527531
};
528532
let location = if needs_resolve && fields_to_resolve.resolve_label_location {
533+
something_to_resolve |= part.linked_location.is_some();
529534
None
530535
} else {
531536
part.linked_location.map(|range| location(snap, range)).transpose()?
@@ -541,7 +546,7 @@ fn inlay_hint_label(
541546
(lsp_types::InlayHintLabel::LabelParts(parts), None)
542547
}
543548
};
544-
Ok(res)
549+
Ok((label, tooltip, something_to_resolve))
545550
}
546551

547552
static TOKEN_RESULT_COUNTER: AtomicU32 = AtomicU32::new(1);

0 commit comments

Comments
 (0)