Draw each message line separately in draw_eol_diagnostic

`set_string_truncated` renders the entire string while ignoring
newlines, so if the diagnostic's message contains multiple lines it
produces messages like 'first linesecond line'.

To avoid these run-ons, this commit renders each line separately,
inserting double spaces for disambiguation.
This commit is contained in:
Ian Hobson 2024-10-02 09:54:45 +02:00
parent 2ca57f02b5
commit 6da03c0072

View File

@ -98,20 +98,29 @@ fn draw_decoration_at(&mut self, g: &'static str, severity: Severity, col: u16,
fn draw_eol_diagnostic(&mut self, diag: &Diagnostic, row: u16, col: usize) -> u16 {
let style = self.styles.severity_style(diag.severity());
let width = self.renderer.viewport.width;
if !self.renderer.column_in_bounds(col + 1, 1) {
return 0;
let start_col = (col - self.renderer.offset.col) as u16;
let mut end_col = start_col;
let mut draw_col = (col + 1) as u16;
for line in diag.message.lines() {
if !self.renderer.column_in_bounds(draw_col as usize, 1) {
break;
}
(end_col, _) = self.renderer.set_string_truncated(
self.renderer.viewport.x + draw_col,
row,
line,
width.saturating_sub(draw_col) as usize,
|_| style,
true,
false,
);
draw_col = end_col - self.renderer.viewport.x + 2; // double space between lines
}
let col = (col - self.renderer.offset.col) as u16;
let (new_col, _) = self.renderer.set_string_truncated(
self.renderer.viewport.x + col + 1,
row,
&diag.message,
width.saturating_sub(col + 1) as usize,
|_| style,
true,
false,
);
new_col - col
end_col - start_col
}
fn draw_diagnostic(&mut self, diag: &Diagnostic, col: u16, next_severity: Option<Severity>) {