Fix a panic when diagnostics contain multiple links (#16601)

Follow up from #14518

Release Notes:

- Fixed a panic when diagnostics contain multiple links
This commit is contained in:
Conrad Irwin 2024-08-21 11:18:43 -06:00 committed by GitHub
parent 8a5fcc2c22
commit 09c698d8d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 42 additions and 3 deletions

View file

@ -9090,6 +9090,43 @@ async fn go_to_prev_overlapping_diagnostic(
"}); "});
} }
#[gpui::test]
async fn test_diagnostics_with_links(cx: &mut TestAppContext) {
init_test(cx, |_| {});
let mut cx = EditorTestContext::new(cx).await;
cx.set_state(indoc! {"
fn func(abˇc def: i32) -> u32 {
}
"});
let project = cx.update_editor(|editor, _| editor.project.clone().unwrap());
cx.update(|cx| {
project.update(cx, |project, cx| {
project.update_diagnostics(
LanguageServerId(0),
lsp::PublishDiagnosticsParams {
uri: lsp::Url::from_file_path("/root/file").unwrap(),
version: None,
diagnostics: vec![lsp::Diagnostic {
range: lsp::Range::new(lsp::Position::new(0, 8), lsp::Position::new(0, 12)),
severity: Some(lsp::DiagnosticSeverity::ERROR),
message: "we've had problems with <https://link.one>, and <https://link.two> is broken".to_string(),
..Default::default()
}],
},
&[],
cx,
)
})
}).unwrap();
cx.run_until_parked();
cx.update_editor(|editor, cx| hover_popover::hover(editor, &Default::default(), cx));
cx.run_until_parked();
cx.update_editor(|editor, _| assert!(editor.hover_state.diagnostic_popover.is_some()))
}
#[gpui::test] #[gpui::test]
async fn go_to_hunk(executor: BackgroundExecutor, cx: &mut gpui::TestAppContext) { async fn go_to_hunk(executor: BackgroundExecutor, cx: &mut gpui::TestAppContext) {
init_test(cx, |_| {}); init_test(cx, |_| {});

View file

@ -96,8 +96,8 @@ pub fn parse_links_only(text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
start: 0, start: 0,
end: text.len(), end: text.len(),
}; };
for link in finder.links(&text[text_range.clone()]) { for link in finder.links(&text) {
let link_range = text_range.start + link.start()..text_range.start + link.end(); let link_range = link.start()..link.end();
if link_range.start > text_range.start { if link_range.start > text_range.start {
events.push((text_range.start..link_range.start, MarkdownEvent::Text)); events.push((text_range.start..link_range.start, MarkdownEvent::Text));
@ -118,7 +118,9 @@ pub fn parse_links_only(text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
text_range.start = link_range.end; text_range.start = link_range.end;
} }
if text_range.end > text_range.start {
events.push((text_range, MarkdownEvent::Text)); events.push((text_range, MarkdownEvent::Text));
}
events events
} }