mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-26 20:09:19 +00:00
Omit hint resolve data better
Omit sending inlay hint resolve data if inlay has no properties that client resolve capabilities support.
This commit is contained in:
parent
7b3dba5d77
commit
7f450da39e
2 changed files with 14 additions and 17 deletions
|
@ -74,14 +74,6 @@ impl InlayFieldsToResolve {
|
||||||
resolve_label_command: false,
|
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)]
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
|
|
|
@ -443,18 +443,19 @@ pub(crate) fn inlay_hint(
|
||||||
inlay_hint: InlayHint,
|
inlay_hint: InlayHint,
|
||||||
) -> Cancellable<lsp_types::InlayHint> {
|
) -> Cancellable<lsp_types::InlayHint> {
|
||||||
let needs_resolve = inlay_hint.needs_resolve;
|
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)?;
|
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 {
|
let text_edits = if needs_resolve && fields_to_resolve.resolve_text_edits {
|
||||||
|
something_to_resolve |= inlay_hint.text_edit.is_some();
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
inlay_hint.text_edit.map(|it| text_edit_vec(line_index, it))
|
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 {
|
Ok(lsp_types::InlayHint {
|
||||||
position: match inlay_hint.position {
|
position: match inlay_hint.position {
|
||||||
|
@ -480,11 +481,13 @@ fn inlay_hint_label(
|
||||||
fields_to_resolve: &InlayFieldsToResolve,
|
fields_to_resolve: &InlayFieldsToResolve,
|
||||||
needs_resolve: bool,
|
needs_resolve: bool,
|
||||||
mut label: InlayHintLabel,
|
mut label: InlayHintLabel,
|
||||||
) -> Cancellable<(lsp_types::InlayHintLabel, Option<lsp_types::InlayHintTooltip>)> {
|
) -> Cancellable<(lsp_types::InlayHintLabel, Option<lsp_types::InlayHintTooltip>, bool)> {
|
||||||
let res = match &*label.parts {
|
let mut something_to_resolve = false;
|
||||||
|
let (label, tooltip) = match &*label.parts {
|
||||||
[InlayHintLabelPart { linked_location: None, .. }] => {
|
[InlayHintLabelPart { linked_location: None, .. }] => {
|
||||||
let InlayHintLabelPart { text, tooltip, .. } = label.parts.pop().unwrap();
|
let InlayHintLabelPart { text, tooltip, .. } = label.parts.pop().unwrap();
|
||||||
let hint_tooltip = if needs_resolve && fields_to_resolve.resolve_hint_tooltip {
|
let hint_tooltip = if needs_resolve && fields_to_resolve.resolve_hint_tooltip {
|
||||||
|
something_to_resolve |= tooltip.is_some();
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
match tooltip {
|
match tooltip {
|
||||||
|
@ -508,6 +511,7 @@ fn inlay_hint_label(
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|part| {
|
.map(|part| {
|
||||||
let tooltip = if needs_resolve && fields_to_resolve.resolve_label_tooltip {
|
let tooltip = if needs_resolve && fields_to_resolve.resolve_label_tooltip {
|
||||||
|
something_to_resolve |= part.tooltip.is_some();
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
match part.tooltip {
|
match part.tooltip {
|
||||||
|
@ -526,6 +530,7 @@ fn inlay_hint_label(
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let location = if needs_resolve && fields_to_resolve.resolve_label_location {
|
let location = if needs_resolve && fields_to_resolve.resolve_label_location {
|
||||||
|
something_to_resolve |= part.linked_location.is_some();
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
part.linked_location.map(|range| location(snap, range)).transpose()?
|
part.linked_location.map(|range| location(snap, range)).transpose()?
|
||||||
|
@ -541,7 +546,7 @@ fn inlay_hint_label(
|
||||||
(lsp_types::InlayHintLabel::LabelParts(parts), None)
|
(lsp_types::InlayHintLabel::LabelParts(parts), None)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Ok(res)
|
Ok((label, tooltip, something_to_resolve))
|
||||||
}
|
}
|
||||||
|
|
||||||
static TOKEN_RESULT_COUNTER: AtomicU32 = AtomicU32::new(1);
|
static TOKEN_RESULT_COUNTER: AtomicU32 = AtomicU32::new(1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue