Simplify InlayFieldsToResolve handling

This commit is contained in:
Kirill Bulatov 2023-08-29 11:14:21 +03:00
parent e07fbabcfe
commit 10464c7c42
3 changed files with 35 additions and 47 deletions

View File

@ -55,38 +55,32 @@ pub struct InlayHintsConfig {
pub fields_to_resolve: InlayFieldsToResolve, pub fields_to_resolve: InlayFieldsToResolve,
} }
#[derive(Clone, Debug, PartialEq, Eq)] #[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct InlayFieldsToResolve { pub struct InlayFieldsToResolve {
pub client_capability_fields: Vec<String>, pub resolve_text_edits: bool,
pub resolve_hint_tooltip: bool,
pub resolve_label_tooltip: bool,
pub resolve_label_location: bool,
pub resolve_label_command: bool,
} }
impl InlayFieldsToResolve { impl InlayFieldsToResolve {
pub const fn empty() -> Self { pub const fn empty() -> Self {
Self { client_capability_fields: Vec::new() } Self {
resolve_text_edits: false,
resolve_hint_tooltip: false,
resolve_label_tooltip: false,
resolve_label_location: false,
resolve_label_command: false,
}
} }
pub fn is_empty(&self) -> bool { pub fn can_resolve(&self) -> bool {
self.client_capability_fields.is_empty() self.resolve_text_edits
} || self.resolve_hint_tooltip
|| self.resolve_label_tooltip
pub fn resolve_text_edits(&self) -> bool { || self.resolve_label_location
self.client_capability_fields.iter().find(|s| s.as_str() == "textEdits").is_some() || self.resolve_label_command
}
pub fn resolve_hint_tooltip(&self) -> bool {
self.client_capability_fields.iter().find(|s| s.as_str() == "tooltip").is_some()
}
pub fn resolve_label_tooltip(&self) -> bool {
self.client_capability_fields.iter().find(|s| s.as_str() == "label.tooltip").is_some()
}
pub fn resolve_label_location(&self) -> bool {
self.client_capability_fields.iter().find(|s| s.as_str() == "label.location").is_some()
}
pub fn resolve_label_command(&self) -> bool {
self.client_capability_fields.iter().find(|s| s.as_str() == "label.command").is_some()
} }
} }
@ -605,19 +599,7 @@ mod tests {
closure_return_type_hints: ClosureReturnTypeHints::WithBlock, closure_return_type_hints: ClosureReturnTypeHints::WithBlock,
binding_mode_hints: true, binding_mode_hints: true,
lifetime_elision_hints: LifetimeElisionHints::Always, lifetime_elision_hints: LifetimeElisionHints::Always,
discriminant_hints: DiscriminantHints::Never, ..DISABLED_CONFIG
render_colons: false,
closure_capture_hints: false,
adjustment_hints: AdjustmentHints::Never,
adjustment_hints_mode: AdjustmentHintsMode::Prefix,
adjustment_hints_hide_outside_unsafe: false,
hide_named_constructor_hints: false,
hide_closure_initialization_hints: false,
closure_style: ClosureStyle::ImplFn,
param_names_for_lifetime_elision_hints: false,
max_length: None,
closing_brace_hints_min_lines: None,
fields_to_resolve: InlayFieldsToResolve::empty(),
}; };
#[track_caller] #[track_caller]

View File

@ -1346,7 +1346,7 @@ pub fn inlay_hints(&self) -> InlayHintsConfig {
.into_iter() .into_iter()
.flatten() .flatten()
.cloned() .cloned()
.collect::<Vec<_>>(); .collect::<FxHashSet<_>>();
InlayHintsConfig { InlayHintsConfig {
render_colons: self.data.inlayHints_renderColons, render_colons: self.data.inlayHints_renderColons,
@ -1408,7 +1408,13 @@ pub fn inlay_hints(&self) -> InlayHintsConfig {
} else { } else {
None None
}, },
fields_to_resolve: InlayFieldsToResolve { client_capability_fields }, fields_to_resolve: InlayFieldsToResolve {
resolve_text_edits: client_capability_fields.contains("textEdits"),
resolve_hint_tooltip: client_capability_fields.contains("tooltip"),
resolve_label_tooltip: client_capability_fields.contains("label.tooltip"),
resolve_label_location: client_capability_fields.contains("label.location"),
resolve_label_command: client_capability_fields.contains("label.command"),
},
} }
} }

View File

@ -443,12 +443,12 @@ pub(crate) fn inlay_hint(
inlay_hint: InlayHint, inlay_hint: InlayHint,
) -> Cancellable<lsp_types::InlayHint> { ) -> Cancellable<lsp_types::InlayHint> {
let (label, tooltip) = inlay_hint_label(snap, fields_to_resolve, inlay_hint.label)?; let (label, tooltip) = inlay_hint_label(snap, fields_to_resolve, inlay_hint.label)?;
let data = if fields_to_resolve.is_empty() { let data = if fields_to_resolve.can_resolve() {
None
} else {
Some(to_value(lsp_ext::InlayHintResolveData { file_id: file_id.0 }).unwrap()) Some(to_value(lsp_ext::InlayHintResolveData { file_id: file_id.0 }).unwrap())
} else {
None
}; };
let text_edits = if fields_to_resolve.resolve_text_edits() { let text_edits = if fields_to_resolve.resolve_text_edits {
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))
@ -481,7 +481,7 @@ fn inlay_hint_label(
let res = match &*label.parts { let res = 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 fields_to_resolve.resolve_hint_tooltip() { let hint_tooltip = if fields_to_resolve.resolve_hint_tooltip {
None None
} else { } else {
match tooltip { match tooltip {
@ -504,7 +504,7 @@ fn inlay_hint_label(
.parts .parts
.into_iter() .into_iter()
.map(|part| { .map(|part| {
let tooltip = if fields_to_resolve.resolve_label_tooltip() { let tooltip = if fields_to_resolve.resolve_label_tooltip {
None None
} else { } else {
match part.tooltip { match part.tooltip {
@ -522,7 +522,7 @@ fn inlay_hint_label(
None => None, None => None,
} }
}; };
let location = if fields_to_resolve.resolve_label_location() { let location = if fields_to_resolve.resolve_label_location {
None None
} else { } else {
part.linked_location.map(|range| location(snap, range)).transpose()? part.linked_location.map(|range| location(snap, range)).transpose()?