fix: defer diagnostic display until leaving Insert mode

This commit is contained in:
2026-10-10 22:34:38 +02:00
parent 3f05287d79
commit f6da7922a1
5 changed files with 67 additions and 7 deletions
+4 -1
View File
@@ -1335,7 +1335,10 @@ impl Editor {
self.active
.diagnostics
.values()
.filter(|annotations| annotations.revision == self.active.text_revision)
.filter(|annotations| {
self.active.mode != Mode::Insert
&& annotations.revision == self.active.text_revision
})
.flat_map(|annotations| &annotations.items)
}
+1 -1
View File
@@ -2805,7 +2805,7 @@ end
.map(|diagnostic| diagnostic.message.as_str()),
None
);
assert_eq!(session.editor().diagnostics().count(), 1);
assert_eq!(session.editor().diagnostics().count(), 0);
session.handle(Input::Char('y'));
assert_eq!(session.editor().diagnostics().count(), 0);
session.handle(Input::Escape);
+58 -4
View File
@@ -2098,6 +2098,47 @@ mod tests {
ratatui::layout::Position::new(4, 0),
);
editor.handle(Input::Char('i'));
terminal
.draw(|frame| viewports.draw(frame, &editor))
.unwrap();
assert_eq!(editor.diagnostics().count(), 0);
assert!(!screen_text(&terminal).contains("E:1"));
assert!(!screen_text(&terminal).contains("E: point"));
assert_ne!(terminal.backend().buffer()[(0, 0)].fg, Color::Red);
assert!(
!terminal.backend().buffer()[(4, 0)]
.modifier
.contains(Modifier::UNDERLINED)
);
for message in ["intermediate", "latest"] {
editor
.replace_diagnostics(
"fixture",
editor.buffer_id(),
editor.text_revision(),
vec![annotation(
(0, 0),
(0, 3),
DiagnosticSeverity::Error,
message,
)],
)
.unwrap();
}
editor.handle(Input::Escape);
terminal
.draw(|frame| viewports.draw(frame, &editor))
.unwrap();
assert!(screen_text(&terminal).contains("E:1"));
assert!(screen_text(&terminal).contains("E: latest"));
assert!(!screen_text(&terminal).contains("intermediate"));
assert_eq!(terminal.backend().buffer()[(0, 0)].fg, Color::Red);
assert!(
terminal.backend().buffer()[(3, 0)]
.modifier
.contains(Modifier::UNDERLINED)
);
editor.handle(Input::Char('i'));
editor.handle(Input::Char('!'));
assert_eq!(editor.mode(), Mode::Insert);
@@ -2111,6 +2152,8 @@ mod tests {
.modifier
.contains(Modifier::UNDERLINED)
);
editor.handle(Input::Escape);
assert_eq!(editor.diagnostics().count(), 0);
}
#[test]
@@ -2153,7 +2196,8 @@ Thread.new do
end
end
Vamp.publish([{type: "diagnostics", buffer_id: document.fetch("id"),
revision: document.fetch("revision"), items: items}])
revision: document.fetch("revision"), items: items},
{type: "message", text: "diagnostic revision #{document.fetch('revision')}"}])
else
target = documents.values.find { |document| document["path"] == Vamp.options.fetch("target") }
raise "Target document is not open" unless target
@@ -2220,16 +2264,26 @@ end
assert_eq!(session.editor().mode(), Mode::Insert);
assert_eq!(session.editor().lines(), &["broken TARGET!"]);
poll_until(&mut session, &mut terminal, &mut viewports, |editor| {
editor.diagnostics().count() == 1
editor.message() == "diagnostic revision 1"
});
assert_eq!(session.editor().diagnostics().count(), 0);
assert!(!screen_text(&terminal).contains("E:1"));
assert!(
!terminal.backend().buffer()[(2, 0)]
.modifier
.contains(Modifier::UNDERLINED)
);
assert_eq!(session.editor().mode(), Mode::Insert);
session.handle(Input::Escape);
terminal
.draw(|frame| viewports.draw(frame, session.editor()))
.unwrap();
assert!(screen_text(&terminal).contains("E:1"));
assert!(
terminal.backend().buffer()[(2, 0)]
.modifier
.contains(Modifier::UNDERLINED)
);
assert_eq!(session.editor().mode(), Mode::Insert);
session.handle(Input::Escape);
session.handle(Input::Char('u'));
assert_eq!(session.editor().lines(), &["broken TARGET"]);
assert_eq!(session.editor().diagnostics().count(), 0);