Randomize inlay highlight range start

This commit is contained in:
Kirill Bulatov
2023-09-14 22:08:12 +03:00
parent 129fb62182
commit 47e0535f1c
3 changed files with 33 additions and 32 deletions
+10 -7
View File
@@ -316,10 +316,10 @@ impl<'a> Iterator for InlayChunks<'a> {
};
let next_inlay_highlight_endpoint;
let offset_in_inlay = self.output_offset - self.transforms.start().0;
if let Some((style, inlay_range)) = inlay_highlight_style_and_range {
let range = inlay_range.highlight_start..inlay_range.highlight_end;
if let Some((style, highlight)) = inlay_highlight_style_and_range {
let range = &highlight.range;
if offset_in_inlay.0 < range.start {
next_inlay_highlight_endpoint = range.start;
next_inlay_highlight_endpoint = range.start - offset_in_inlay.0;
} else if offset_in_inlay.0 >= range.end {
next_inlay_highlight_endpoint = usize::MAX;
} else {
@@ -1711,25 +1711,28 @@ mod tests {
.filter_map(|i| {
let (_, inlay) = &inlays[i];
let inlay_text_len = inlay.text.len();
// TODO kb gen_range
match inlay_text_len {
0 => None,
1 => Some(InlayHighlight {
inlay: inlay.id,
inlay_position: inlay.position,
highlight_start: 0,
highlight_end: 1,
range: 0..1,
}),
n => {
let inlay_text = inlay.text.to_string();
let mut highlight_end = rng.gen_range(1..n);
let mut highlight_start = rng.gen_range(0..highlight_end);
while !inlay_text.is_char_boundary(highlight_end) {
highlight_end += 1;
}
while !inlay_text.is_char_boundary(highlight_start) {
highlight_start -= 1;
}
Some(InlayHighlight {
inlay: inlay.id,
inlay_position: inlay.position,
highlight_start: 0,
highlight_end,
range: highlight_start..highlight_end,
})
}
}
+1 -1
View File
@@ -107,7 +107,7 @@ pub fn hover_at_inlay(editor: &mut Editor, inlay_hover: InlayHover, cx: &mut Vie
let hover_popover = InfoPopover {
project: project.clone(),
symbol_range: RangeInEditor::Inlay(inlay_hover.range),
symbol_range: RangeInEditor::Inlay(inlay_hover.range.clone()),
blocks: vec![inlay_hover.tooltip],
language: None,
rendered_content: None,
+22 -24
View File
@@ -43,10 +43,10 @@ impl RangeInEditor {
let point_after_start = range.start.cmp(point, &snapshot.buffer_snapshot).is_le();
point_after_start && range.end.cmp(point, &snapshot.buffer_snapshot).is_ge()
}
(Self::Inlay(range), TriggerPoint::InlayHint(point, _, _)) => {
range.inlay == point.inlay
&& range.highlight_start.cmp(&point.highlight_end).is_le()
&& range.highlight_end.cmp(&point.highlight_end).is_ge()
(Self::Inlay(highlight), TriggerPoint::InlayHint(point, _, _)) => {
highlight.inlay == point.inlay
&& highlight.range.contains(&point.range.start)
&& highlight.range.contains(&point.range.end)
}
(Self::Inlay(_), TriggerPoint::Text(_))
| (Self::Text(_), TriggerPoint::InlayHint(_, _, _)) => false,
@@ -66,13 +66,11 @@ pub enum GoToDefinitionLink {
InlayHint(lsp::Location, LanguageServerId),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InlayHighlight {
pub inlay: InlayId,
pub inlay_position: Anchor,
// TODO kb turn into Range<usize>
pub highlight_start: usize,
pub highlight_end: usize,
pub range: Range<usize>,
}
#[derive(Debug, Clone)]
@@ -252,9 +250,8 @@ pub fn update_inlay_link_and_hover_points(
range: InlayHighlight {
inlay: hovered_hint.id,
inlay_position: hovered_hint.position,
highlight_start: extra_shift_left,
highlight_end: hovered_hint.text.len()
+ extra_shift_right,
range: extra_shift_left
..hovered_hint.text.len() + extra_shift_right,
},
},
cx,
@@ -272,13 +269,14 @@ pub fn update_inlay_link_and_hover_points(
hovered_offset,
)
{
let range = InlayHighlight {
let highlight_start =
(part_range.start - hint_start).0 + extra_shift_left;
let highlight_end =
(part_range.end - hint_start).0 + extra_shift_right;
let highlight = InlayHighlight {
inlay: hovered_hint.id,
inlay_position: hovered_hint.position,
highlight_start: (part_range.start - hint_start).0
+ extra_shift_left,
highlight_end: (part_range.end - hint_start).0
+ extra_shift_right,
range: highlight_start..highlight_end,
};
if let Some(tooltip) = hovered_hint_part.tooltip {
hover_popover::hover_at_inlay(
@@ -299,7 +297,7 @@ pub fn update_inlay_link_and_hover_points(
kind: content.kind,
},
},
range,
range: highlight.clone(),
},
cx,
);
@@ -312,7 +310,7 @@ pub fn update_inlay_link_and_hover_points(
update_go_to_definition_link(
editor,
Some(GoToDefinitionTrigger::InlayHint(
range,
highlight,
location,
language_server_id,
)),
@@ -433,8 +431,8 @@ pub fn show_link_definition(
)
})
}
TriggerPoint::InlayHint(trigger_source, lsp_location, server_id) => Some((
Some(RangeInEditor::Inlay(*trigger_source)),
TriggerPoint::InlayHint(highlight, lsp_location, server_id) => Some((
Some(RangeInEditor::Inlay(highlight.clone())),
vec![GoToDefinitionLink::InlayHint(
lsp_location.clone(),
*server_id,
@@ -501,8 +499,8 @@ pub fn show_link_definition(
..snapshot.anchor_after(offset_range.end),
)
}
TriggerPoint::InlayHint(inlay_coordinates, _, _) => {
RangeInEditor::Inlay(*inlay_coordinates)
TriggerPoint::InlayHint(highlight, _, _) => {
RangeInEditor::Inlay(highlight.clone())
}
});
@@ -513,9 +511,9 @@ pub fn show_link_definition(
style,
cx,
),
RangeInEditor::Inlay(inlay_coordinates) => this
RangeInEditor::Inlay(highlight) => this
.highlight_inlays::<LinkGoToDefinitionState>(
vec![inlay_coordinates],
vec![highlight],
style,
cx,
),