Skip to content

Commit 57ff435

Browse files
committed
Special case when a code line only has multiline span starts
``` 3 │ X0 Y0 Z0 │ ┏━━━━━┛ │ │ │ ┃┌───────┘ │ │ ┃│┌─────────┘ 4 │ ┃││ X1 Y1 Z1 5 │ ┃││ X2 Y2 Z2 │ ┃│└────╿──│──┘ `Z` label │ ┃└─────│──┤ │ ┗━━━━━━┥ `Y` is a good letter too ╰╴ `X` is a good letter ```
1 parent 82e45ef commit 57ff435

File tree

4 files changed

+44
-38
lines changed

4 files changed

+44
-38
lines changed

compiler/rustc_errors/src/emitter.rs

+26-1
Original file line numberDiff line numberDiff line change
@@ -915,7 +915,7 @@ impl HumanEmitter {
915915
// <EMPTY LINE>
916916
//
917917
let mut annotations_position = vec![];
918-
let mut line_len = 0;
918+
let mut line_len: usize = 0;
919919
let mut p = 0;
920920
for (i, annotation) in annotations.iter().enumerate() {
921921
for (j, next) in annotations.iter().enumerate() {
@@ -986,6 +986,31 @@ impl HumanEmitter {
986986
return vec![];
987987
}
988988

989+
if annotations_position
990+
.iter()
991+
.all(|(_, ann)| matches!(ann.annotation_type, AnnotationType::MultilineStart(_)))
992+
&& let Some(max_pos) = annotations_position.iter().map(|(pos, _)| *pos).max()
993+
{
994+
// Special case the following, so that we minimize overlapping multiline spans.
995+
//
996+
// 3 │ X0 Y0 Z0
997+
// │ ┏━━━━━┛ │ │ < We are writing these lines
998+
// │ ┃┌───────┘ │ < by reverting the "depth" of
999+
// │ ┃│┌─────────┘ < their multilne spans.
1000+
// 4 │ ┃││ X1 Y1 Z1
1001+
// 5 │ ┃││ X2 Y2 Z2
1002+
// │ ┃│└────╿──│──┘ `Z` label
1003+
// │ ┃└─────│──┤
1004+
// │ ┗━━━━━━┥ `Y` is a good letter too
1005+
// ╰╴ `X` is a good letter
1006+
for (pos, _) in &mut annotations_position {
1007+
*pos = max_pos - *pos;
1008+
}
1009+
// We know then that we don't need an additional line for the span label, saving us
1010+
// one line of vertical space.
1011+
line_len = line_len.saturating_sub(1);
1012+
}
1013+
9891014
// Write the column separator.
9901015
//
9911016
// After this we will have:

compiler/rustc_parse/src/parser/tests.rs

+14-31
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,8 @@ error: foo
369369
--> test.rs:3:3
370370
|
371371
3 | X0 Y0
372-
| ___^__-
373-
| |___|
374-
| ||
372+
| ____^ -
373+
| | ______|
375374
4 | || X1 Y1
376375
5 | || X2 Y2
377376
| ||____^__- `Y` is a good letter too
@@ -384,9 +383,8 @@ error: foo
384383
╭▸ test.rs:3:3
385384
386385
3 │ X0 Y0
387-
│ ┌───╿──┘
388-
│ ┏│━━━┙
389-
│ ┃│
386+
│ ┏━━━━┛ │
387+
│ ┃┌──────┘
390388
4 │ ┃│ X1 Y1
391389
5 │ ┃│ X2 Y2
392390
│ ┃└────╿──┘ `Y` is a good letter too
@@ -424,9 +422,8 @@ error: foo
424422
--> test.rs:3:3
425423
|
426424
3 | X0 Y0
427-
| ___^__-
428-
| |___|
429-
| ||
425+
| ____^ -
426+
| | ______|
430427
4 | || Y1 X1
431428
| ||____-__^ `X` is a good letter
432429
| |____|
@@ -438,9 +435,8 @@ error: foo
438435
╭▸ test.rs:3:3
439436
440437
3 │ X0 Y0
441-
│ ┌───╿──┘
442-
│ ┏│━━━┙
443-
│ ┃│
438+
│ ┏━━━━┛ │
439+
│ ┃┌──────┘
444440
4 │ ┃│ Y1 X1
445441
│ ┗│━━━━│━━┛ `X` is a good letter
446442
│ └────┤
@@ -1360,10 +1356,9 @@ error: foo
13601356
--> test.rs:3:3
13611357
|
13621358
3 | X0 Y0 Z0
1363-
| ___^__-__-
1364-
| |___|__|
1365-
| ||___|
1366-
| |||
1359+
| _____^ - -
1360+
| | _______| |
1361+
| || _________|
13671362
4 | ||| X1 Y1 Z1
13681363
5 | ||| X2 Y2 Z2
13691364
| |||____^__-__- `Z` label
@@ -1377,10 +1372,9 @@ error: foo
13771372
╭▸ test.rs:3:3
13781373
13791374
3 │ X0 Y0 Z0
1380-
│ ┌───╿──│──┘
1381-
│ ┌│───│──┘
1382-
│ ┏││━━━┙
1383-
│ ┃││
1375+
│ ┏━━━━━┛ │ │
1376+
│ ┃┌───────┘ │
1377+
│ ┃│┌─────────┘
13841378
4 │ ┃││ X1 Y1 Z1
13851379
5 │ ┃││ X2 Y2 Z2
13861380
│ ┃│└────╿──│──┘ `Z` label
@@ -1389,17 +1383,6 @@ error: foo
13891383
╰╴ `X` is a good letter
13901384
13911385
"#,
1392-
// FIXME: This would ideally instead look like this
1393-
// 3 │ X0 Y0 Z0
1394-
// │ ┏━━━━━┛ │ │
1395-
// │ ┃┌───────┘ │
1396-
// │ ┃│┌─────────┘
1397-
// 4 │ ┃││ X1 Y1 Z1
1398-
// 5 │ ┃││ X2 Y2 Z2
1399-
// │ ┃│└────╿──│──┘ `Z` label
1400-
// │ ┃└─────│──┤
1401-
// │ ┗━━━━━━┥ `Y` is a good letter too
1402-
// ╰╴ `X` is a good letter
14031386
);
14041387
}
14051388

tests/ui/async-await/async-is-unwindsafe.stderr

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ error[E0277]: the type `&mut Context<'_>` may not be safely transferred across a
22
--> $DIR/async-is-unwindsafe.rs:12:5
33
|
44
LL | is_unwindsafe(async {
5-
| _____^_____________-
6-
| |_____|
7-
| ||
5+
| ______^ -
6+
| | ___________________|
87
LL | ||
98
LL | || use std::ptr::null;
109
LL | || use std::task::{Context, RawWaker, RawWakerVTable, Waker};

tests/ui/lint/suggestions.stderr

+2-3
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,8 @@ warning: variable does not need to be mutable
4141
--> $DIR/suggestions.rs:54:13
4242
|
4343
LL | let mut
44-
| ______________^
45-
| | _____________|
46-
| ||
44+
| _____________^
45+
| |_____________|
4746
LL | || b = 1;
4847
| ||____________-^
4948
| |_____________|

0 commit comments

Comments
 (0)