Strip off inlay hints data that should be resolved

This commit is contained in:
Kirill Bulatov 2023-08-14 22:42:22 +03:00
parent 5ce7ccac32
commit 27bf01c3a8
2 changed files with 14 additions and 46 deletions

View File

@ -434,7 +434,9 @@ impl LanguageServer {
..Default::default() ..Default::default()
}), }),
inlay_hint: Some(InlayHintClientCapabilities { inlay_hint: Some(InlayHintClientCapabilities {
resolve_support: None, resolve_support: Some(InlayHintResolveClientCapabilities {
properties: vec!["textEdits".to_string(), "tooltip".to_string()],
}),
dynamic_registration: Some(false), dynamic_registration: Some(false),
}), }),
..Default::default() ..Default::default()

View File

@ -1954,7 +1954,7 @@ impl LspCommand for InlayHints {
_: &mut Project, _: &mut Project,
_: PeerId, _: PeerId,
buffer_version: &clock::Global, buffer_version: &clock::Global,
cx: &mut AppContext, _: &mut AppContext,
) -> proto::InlayHintsResponse { ) -> proto::InlayHintsResponse {
proto::InlayHintsResponse { proto::InlayHintsResponse {
hints: response hints: response
@ -1963,51 +1963,17 @@ impl LspCommand for InlayHints {
position: Some(language::proto::serialize_anchor(&response_hint.position)), position: Some(language::proto::serialize_anchor(&response_hint.position)),
padding_left: response_hint.padding_left, padding_left: response_hint.padding_left,
padding_right: response_hint.padding_right, padding_right: response_hint.padding_right,
label: Some(proto::InlayHintLabel {
label: Some(match response_hint.label {
InlayHintLabel::String(s) => proto::inlay_hint_label::Label::Value(s),
InlayHintLabel::LabelParts(label_parts) => {
proto::inlay_hint_label::Label::LabelParts(proto::InlayHintLabelParts {
parts: label_parts.into_iter().map(|label_part| proto::InlayHintLabelPart {
value: label_part.value,
tooltip: label_part.tooltip.map(|tooltip| {
let proto_tooltip = match tooltip {
InlayHintLabelPartTooltip::String(s) => proto::inlay_hint_label_part_tooltip::Content::Value(s),
InlayHintLabelPartTooltip::MarkupContent(markup_content) => proto::inlay_hint_label_part_tooltip::Content::MarkupContent(proto::MarkupContent {
kind: markup_content.kind,
value: markup_content.value,
}),
};
proto::InlayHintLabelPartTooltip {content: Some(proto_tooltip)}
}),
location: label_part.location.map(|location| proto::Location {
start: Some(serialize_anchor(&location.range.start)),
end: Some(serialize_anchor(&location.range.end)),
buffer_id: location.buffer.read(cx).remote_id(),
}),
}).collect()
})
}
}),
}),
kind: response_hint.kind.map(|kind| kind.name().to_string()), kind: response_hint.kind.map(|kind| kind.name().to_string()),
tooltip: response_hint.tooltip.map(|response_tooltip| { // Do not pass extra data such as tooltips to clients: host can put tooltip data from the cache during resolution.
let proto_tooltip = match response_tooltip { tooltip: None,
InlayHintTooltip::String(s) => { // Similarly, do not pass label parts to clients: host can return a detailed list during resolution.
proto::inlay_hint_tooltip::Content::Value(s) label: Some(proto::InlayHintLabel {
} label: Some(proto::inlay_hint_label::Label::Value(
InlayHintTooltip::MarkupContent(markup_content) => { match response_hint.label {
proto::inlay_hint_tooltip::Content::MarkupContent( InlayHintLabel::String(s) => s,
proto::MarkupContent { InlayHintLabel::LabelParts(_) => response_hint.text(),
kind: markup_content.kind, },
value: markup_content.value, )),
},
)
}
};
proto::InlayHintTooltip {
content: Some(proto_tooltip),
}
}), }),
}) })
.collect(), .collect(),