Dismiss active diagnostics on invalidation (#25646)

When migrating to gpui2,
https://github.com/zed-industries/zed/commit/588976d27a22bb36a5aac7e762b21e180a66a2f9#diff-a3da3181e4ab4f73aa1697d7b6dc0caa0c17b2a187fb83b076dfc0234ec91f54R21
removed the diagnostic style for "active but invalid" case: presumably,
it served as some sort of a cursor to show where to move on after the
diagnostics update, on the next `GoTo[Prev]Diagnostic` action call.

As this change went unchanged for some time, another approach is tested
now, to be more integrated with inline diagnostics: now, the active
state is cleared

Same as before this change, another `GoTo[Prev]Diagnostic` action call
will be needed to re-expand a new diagnostics, but this change makes
this expansion to happen after the cursor — before the change, Zed would
continue from the stale diagnostics.

Release Notes:

- Fixed active diagnostics becoming stale
This commit is contained in:
Kirill Bulatov
2025-02-26 22:30:23 +02:00
committed by GitHub
parent d694458659
commit d2b49de0e4
3 changed files with 116 additions and 15 deletions
+15 -12
View File
@@ -994,7 +994,7 @@ struct RegisteredInlineCompletionProvider {
_subscription: Subscription,
}
#[derive(Debug)]
#[derive(Debug, PartialEq, Eq)]
struct ActiveDiagnosticGroup {
primary_range: Range<Anchor>,
primary_message: String,
@@ -12539,16 +12539,20 @@ impl Editor {
if is_valid != active_diagnostics.is_valid {
active_diagnostics.is_valid = is_valid;
let mut new_styles = HashMap::default();
for (block_id, diagnostic) in &active_diagnostics.blocks {
new_styles.insert(
*block_id,
diagnostic_block_renderer(diagnostic.clone(), None, true, is_valid),
);
if is_valid {
let mut new_styles = HashMap::default();
for (block_id, diagnostic) in &active_diagnostics.blocks {
new_styles.insert(
*block_id,
diagnostic_block_renderer(diagnostic.clone(), None, true),
);
}
self.display_map.update(cx, |display_map, _cx| {
display_map.replace_blocks(new_styles);
});
} else {
self.dismiss_diagnostics(cx);
}
self.display_map.update(cx, |display_map, _cx| {
display_map.replace_blocks(new_styles)
});
}
}
}
@@ -12599,7 +12603,7 @@ impl Editor {
buffer.anchor_after(entry.range.start),
),
height: message_height,
render: diagnostic_block_renderer(diagnostic, None, true, true),
render: diagnostic_block_renderer(diagnostic, None, true),
priority: 0,
}
}),
@@ -17795,7 +17799,6 @@ pub fn diagnostic_block_renderer(
diagnostic: Diagnostic,
max_message_rows: Option<u8>,
allow_closing: bool,
_is_valid: bool,
) -> RenderBlock {
let (text_without_backticks, code_ranges) =
highlight_diagnostic_message(&diagnostic, max_message_rows);