Skip to content

Commit b1c4112

Browse files
committed
fix: Tweak rendering for single ASCII whitespace
This PR includes a small fix (that I am not at all sure about) and a regression test that fails on current master. The input here is just a single ASCII whitespace with an annotation pointing to immediately after that whitespace. In current master, it gets rendered like this: ``` error: missing trailing newline at end of file | 1 | ... | ^ W292 | = help: Add trailing newline ``` But I think the insertion of an ellipsis here is not quite right. I was certainly confused by the output. I don't really understand the formatting code at all, but I believe the ellipsis is being inserted by this code: ```rust if self.margin.was_cut_left() { // We have stripped some code/whitespace from the beginning, make it clear. buffer.puts(line_offset, code_offset, "...", *lineno_color); } ``` And `self.margin.was_cut_left()` was returning true because `computed_left` was set to `18446744073709551593`. This kind of value _seems_ like a bug, although some margin values are explicitly initialized to `usize::MAX`, so maybe not. Anywho, I tried removing the condition gating the setting of `whitespace_margin`, and that seems to fix this specific case without any other _known_ regressions (including across all of `ruff`'s test suite), but this was mostly a result of me feeling around in the dark here.
1 parent 7132bf3 commit b1c4112

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

src/renderer/display_list.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -1400,9 +1400,7 @@ fn format_body(
14001400
}
14011401
})
14021402
.sum();
1403-
if line.chars().any(|c| !c.is_whitespace()) {
1404-
whitespace_margin = min(whitespace_margin, leading_whitespace);
1405-
}
1403+
whitespace_margin = min(whitespace_margin, leading_whitespace);
14061404
max_line_len = max(max_line_len, line_length);
14071405

14081406
let line_start_index = line_range.0;

tests/formatter.rs

+26
Original file line numberDiff line numberDiff line change
@@ -955,3 +955,29 @@ error: title
955955
let renderer = Renderer::plain();
956956
assert_data_eq!(renderer.render(input).to_string(), expected);
957957
}
958+
959+
// This tests that reasonable rendering is done in an odd case: when the source
960+
// is a single ASCII whitespace and there's annotation pointing to immediately
961+
// after it.
962+
//
963+
// Previously, this would end up with a `...` rendered instead of just the
964+
// space itself. The `...` seems incorrect here because I don't believe any
965+
// trimming occurs (or is needed).
966+
#[test]
967+
fn one_space_annotation() {
968+
let source = " ";
969+
let input = Level::Error.title("title").snippet(
970+
Snippet::source(source)
971+
.fold(false)
972+
.annotation(Level::Error.span(1..1).label("annotation")),
973+
);
974+
let expected = "\
975+
error: title
976+
|
977+
1 |\x20\x20
978+
| ^ annotation
979+
|\
980+
";
981+
let renderer = Renderer::plain();
982+
assert_data_eq!(renderer.render(input).to_string(), expected);
983+
}

0 commit comments

Comments
 (0)