Skip to content

Commit 65b4022

Browse files
authored
Merge pull request #265 from Muscraft/multi-suggestion-separator
fix: Use the multi-suggestion-separator between suggestions
2 parents b7989e6 + 41932eb commit 65b4022

File tree

2 files changed

+710
-27
lines changed

2 files changed

+710
-27
lines changed

src/renderer/mod.rs

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,6 @@ impl Renderer {
264264
}
265265
}
266266
let mut message_iter = group.elements.iter().enumerate().peekable();
267-
let mut last_was_suggestion = false;
268267
if let Some(title) = &group.title {
269268
let peek = message_iter.peek().map(|(_, s)| s).copied();
270269
let title_style = if g == 0 {
@@ -299,6 +298,7 @@ impl Renderer {
299298
}
300299
}
301300
let mut seen_primary = false;
301+
let mut last_suggestion_path = None;
302302
while let Some((i, section)) = message_iter.next() {
303303
let peek = message_iter.peek().map(|(_, s)| s).copied();
304304
let is_first = i == 0;
@@ -314,7 +314,6 @@ impl Renderer {
314314
peek.is_some(),
315315
buffer_msg_line_offset,
316316
);
317-
last_was_suggestion = false;
318317
}
319318
Element::Cause(cause) => {
320319
if let Some((source_map, annotated_lines)) =
@@ -354,22 +353,27 @@ impl Renderer {
354353
}
355354
}
356355
}
357-
358-
last_was_suggestion = false;
359356
}
360357
Element::Suggestion(suggestion) => {
361358
let source_map =
362359
SourceMap::new(&suggestion.source, suggestion.line_start);
360+
let matches_previous_suggestion =
361+
last_suggestion_path == Some(suggestion.path.as_ref());
363362
self.emit_suggestion_default(
364363
&mut buffer,
365364
suggestion,
366365
max_line_num_len,
367366
&source_map,
368367
primary_path.or(og_primary_path),
369-
last_was_suggestion,
368+
matches_previous_suggestion,
370369
is_first,
371370
);
372-
last_was_suggestion = true;
371+
372+
if matches!(peek, Some(Element::Suggestion(_))) {
373+
last_suggestion_path = Some(suggestion.path.as_ref());
374+
} else {
375+
last_suggestion_path = None;
376+
}
373377
}
374378

375379
Element::Origin(origin) => {
@@ -384,7 +388,6 @@ impl Renderer {
384388
is_first,
385389
buffer_msg_line_offset,
386390
);
387-
last_was_suggestion = false;
388391
}
389392
Element::Padding(_) => {
390393
let current_line = buffer.num_lines();
@@ -1614,48 +1617,46 @@ impl Renderer {
16141617
max_line_num_len: usize,
16151618
sm: &SourceMap<'_>,
16161619
primary_path: Option<&Cow<'_, str>>,
1617-
is_cont: bool,
1620+
matches_previous_suggestion: bool,
16181621
is_first: bool,
16191622
) {
16201623
let suggestions = sm.splice_lines(suggestion.markers.clone());
16211624

16221625
let buffer_offset = buffer.num_lines();
1623-
let mut row_num = buffer_offset + usize::from(!is_cont);
1624-
for (i, (complete, parts, highlights)) in suggestions.iter().enumerate() {
1626+
let mut row_num = buffer_offset + usize::from(!matches_previous_suggestion);
1627+
for (complete, parts, highlights) in &suggestions {
16251628
let has_deletion = parts
16261629
.iter()
16271630
.any(|p| p.is_deletion(sm) || p.is_destructive_replacement(sm));
16281631
let is_multiline = complete.lines().count() > 1;
16291632

1630-
if i == 0 {
1631-
self.draw_col_separator_start(buffer, row_num - 1, max_line_num_len + 1);
1632-
} else {
1633+
if matches_previous_suggestion {
16331634
buffer.puts(
16341635
row_num - 1,
16351636
max_line_num_len + 1,
16361637
self.multi_suggestion_separator(),
16371638
ElementStyle::LineNumber,
16381639
);
1640+
} else {
1641+
self.draw_col_separator_start(buffer, row_num - 1, max_line_num_len + 1);
16391642
}
16401643
if suggestion.path.as_ref() != primary_path {
16411644
if let Some(path) = suggestion.path.as_ref() {
1642-
let (loc, _) = sm.span_to_locations(parts[0].span.clone());
1643-
// --> file.rs:line:col
1644-
// |
1645-
let arrow = self.file_start(is_first);
1646-
buffer.puts(row_num - 1, 0, arrow, ElementStyle::LineNumber);
1647-
let message = format!("{}:{}:{}", path, loc.line, loc.char + 1);
1648-
if is_cont {
1649-
buffer.append(row_num - 1, &message, ElementStyle::LineAndColumn);
1650-
} else {
1645+
if !matches_previous_suggestion {
1646+
let (loc, _) = sm.span_to_locations(parts[0].span.clone());
1647+
// --> file.rs:line:col
1648+
// |
1649+
let arrow = self.file_start(is_first);
1650+
buffer.puts(row_num - 1, 0, arrow, ElementStyle::LineNumber);
1651+
let message = format!("{}:{}:{}", path, loc.line, loc.char + 1);
16511652
let col = usize::max(max_line_num_len + 1, arrow.len());
16521653
buffer.puts(row_num - 1, col, &message, ElementStyle::LineAndColumn);
1654+
for _ in 0..max_line_num_len {
1655+
buffer.prepend(row_num - 1, " ", ElementStyle::NoStyle);
1656+
}
1657+
self.draw_col_separator_no_space(buffer, row_num, max_line_num_len + 1);
1658+
row_num += 1;
16531659
}
1654-
for _ in 0..max_line_num_len {
1655-
buffer.prepend(row_num - 1, " ", ElementStyle::NoStyle);
1656-
}
1657-
self.draw_col_separator_no_space(buffer, row_num, max_line_num_len + 1);
1658-
row_num += 1;
16591660
}
16601661
}
16611662
let show_code_change = if has_deletion && !is_multiline {

0 commit comments

Comments
 (0)