Skip to content

Commit ffa5268

Browse files
authored
Merge pull request #334 from Muscraft/fix-annotating-leading-whitespace
fix: Properly handle annotating leading whitespace
2 parents c3102bc + 7d7322a commit ffa5268

File tree

3 files changed

+58
-6
lines changed

3 files changed

+58
-6
lines changed

src/renderer/margin.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,12 @@ impl Margin {
7171

7272
if self.computed_right - self.computed_left > self.term_width {
7373
// Trimming only whitespace isn't enough, let's get craftier.
74-
if self.label_right - self.whitespace_left <= self.term_width {
74+
if self.label_right.saturating_sub(self.whitespace_left) <= self.term_width
75+
// Trimming whitespace when the right-most label is somewhrere
76+
// within it would result in the label pointing to the wrong
77+
// place
78+
&& self.label_right >= self.whitespace_left
79+
{
7580
// Attempt to fit the code window only trimming whitespace.
7681
self.computed_left = self.whitespace_left;
7782
self.computed_right = self.computed_left + self.term_width;

src/renderer/render.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -622,11 +622,6 @@ fn render_snippet_annotations(
622622
// Get the left-side margin to remove it
623623
let mut whitespace_margin = usize::MAX;
624624
for line_info in annotated_lines {
625-
// Whitespace can only be removed (aka considered leading)
626-
// if the lexer considers it whitespace.
627-
// non-rustc_lexer::is_whitespace() chars are reported as an
628-
// error (ex. no-break-spaces \u{a0}), and thus can't be considered
629-
// for removal during error reporting.
630625
let leading_whitespace = line_info
631626
.line
632627
.chars()

tests/rustc_tests.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5646,3 +5646,55 @@ LL │ static ROOK_ATTACKS_TABLE: () = {
56465646
let renderer = renderer.decor_style(DecorStyle::Unicode);
56475647
assert_data_eq!(renderer.render(input), expected_unicode);
56485648
}
5649+
5650+
#[test]
5651+
fn emitter_overflow_bad_whitespace() {
5652+
// tests/ui/errors/emitter-overflow-bad-whitespace.rs
5653+
let source = r#"                                        fn main() { return; }
5654+
"#;
5655+
let title_0 = "Unicode character ' ' (No-Break Space) looks like ' ' (Space), but it is not";
5656+
5657+
let report = &[
5658+
Group::with_title(Level::ERROR.primary_title("unknown start of token: \u{a0}")).element(
5659+
Snippet::source(source)
5660+
.path("$DIR/emitter-overflow-bad-whitespace.rs")
5661+
.line_start(10)
5662+
.annotation(AnnotationKind::Primary.span(0..2)),
5663+
),
5664+
Group::with_title(Level::HELP.secondary_title(title_0)).element(
5665+
Snippet::source(source)
5666+
.path("$DIR/emitter-overflow-bad-whitespace.rs")
5667+
.line_start(10)
5668+
.patch(Patch::new(0..2, " ")),
5669+
),
5670+
];
5671+
let expected_ascii = str![[r#"
5672+
error: unknown start of token:  
5673+
--> $DIR/emitter-overflow-bad-whitespace.rs:10:1
5674+
|
5675+
10 |     ...
5676+
| ^
5677+
|
5678+
help: Unicode character ' ' (No-Break Space) looks like ' ' (Space), but it is not
5679+
|
5680+
10 |                                       fn main() { return; }
5681+
| +
5682+
"#]];
5683+
let renderer_ascii = Renderer::plain().term_width(1);
5684+
assert_data_eq!(renderer_ascii.render(report), expected_ascii);
5685+
5686+
let expected_unicode = str![[r#"
5687+
error: unknown start of token:  
5688+
╭▸ $DIR/emitter-overflow-bad-whitespace.rs:10:1
5689+
5690+
10 │       …
5691+
│ ━
5692+
╰╴
5693+
help: Unicode character ' ' (No-Break Space) looks like ' ' (Space), but it is not
5694+
╭╴
5695+
10 │                                       fn main() { return; }
5696+
╰╴+
5697+
"#]];
5698+
let renderer_unicode = renderer_ascii.decor_style(DecorStyle::Unicode);
5699+
assert_data_eq!(renderer_unicode.render(report), expected_unicode);
5700+
}

0 commit comments

Comments
 (0)