Fix overflow in error emitter
This commit is contained in:
parent
8a281f9c79
commit
cbb41008fd
6 changed files with 108 additions and 22 deletions
|
@ -2303,22 +2303,25 @@ impl EmitterWriter {
|
||||||
|
|
||||||
// Colorize addition/replacements with green.
|
// Colorize addition/replacements with green.
|
||||||
for &SubstitutionHighlight { start, end } in highlight_parts {
|
for &SubstitutionHighlight { start, end } in highlight_parts {
|
||||||
// Account for tabs when highlighting (#87972).
|
// This is a no-op for empty ranges
|
||||||
let tabs: usize = line_to_add
|
if start != end {
|
||||||
.chars()
|
// Account for tabs when highlighting (#87972).
|
||||||
.take(start)
|
let tabs: usize = line_to_add
|
||||||
.map(|ch| match ch {
|
.chars()
|
||||||
'\t' => 3,
|
.take(start)
|
||||||
_ => 0,
|
.map(|ch| match ch {
|
||||||
})
|
'\t' => 3,
|
||||||
.sum();
|
_ => 0,
|
||||||
buffer.set_style_range(
|
})
|
||||||
*row_num,
|
.sum();
|
||||||
max_line_num_len + 3 + start + tabs,
|
buffer.set_style_range(
|
||||||
max_line_num_len + 3 + end + tabs,
|
*row_num,
|
||||||
Style::Addition,
|
max_line_num_len + 3 + start + tabs,
|
||||||
true,
|
max_line_num_len + 3 + end + tabs,
|
||||||
);
|
Style::Addition,
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*row_num += 1;
|
*row_num += 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -330,12 +330,11 @@ impl CodeSuggestion {
|
||||||
});
|
});
|
||||||
buf.push_str(&part.snippet);
|
buf.push_str(&part.snippet);
|
||||||
let cur_hi = sm.lookup_char_pos(part.span.hi());
|
let cur_hi = sm.lookup_char_pos(part.span.hi());
|
||||||
if cur_hi.line == cur_lo.line && !part.snippet.is_empty() {
|
// Account for the difference between the width of the current code and the
|
||||||
// Account for the difference between the width of the current code and the
|
// snippet being suggested, so that the *later* suggestions are correctly
|
||||||
// snippet being suggested, so that the *later* suggestions are correctly
|
// aligned on the screen. Note that cur_hi and cur_lo can be on different
|
||||||
// aligned on the screen.
|
// lines, so cur_hi.col can be smaller than cur_lo.col
|
||||||
acc += len - (cur_hi.col.0 - cur_lo.col.0) as isize;
|
acc += len - (cur_hi.col.0 as isize - cur_lo.col.0 as isize);
|
||||||
}
|
|
||||||
prev_hi = cur_hi;
|
prev_hi = cur_hi;
|
||||||
prev_line = sf.get_line(prev_hi.line - 1);
|
prev_line = sf.get_line(prev_hi.line - 1);
|
||||||
for line in part.snippet.split('\n').skip(1) {
|
for line in part.snippet.split('\n').skip(1) {
|
||||||
|
|
12
tests/ui/suggestions/issue-109854.rs
Normal file
12
tests/ui/suggestions/issue-109854.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
fn generate_setter() {
|
||||||
|
String::with_capacity(
|
||||||
|
//~^ ERROR this function takes 1 argument but 3 arguments were supplied
|
||||||
|
generate_setter,
|
||||||
|
r#"
|
||||||
|
pub(crate) struct Person<T: Clone> {}
|
||||||
|
"#,
|
||||||
|
r#""#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
31
tests/ui/suggestions/issue-109854.stderr
Normal file
31
tests/ui/suggestions/issue-109854.stderr
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
error[E0061]: this function takes 1 argument but 3 arguments were supplied
|
||||||
|
--> $DIR/issue-109854.rs:2:5
|
||||||
|
|
|
||||||
|
LL | String::with_capacity(
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
...
|
||||||
|
LL | / r#"
|
||||||
|
LL | | pub(crate) struct Person<T: Clone> {}
|
||||||
|
LL | | "#,
|
||||||
|
| |__- unexpected argument of type `&'static str`
|
||||||
|
LL | r#""#,
|
||||||
|
| ----- unexpected argument of type `&'static str`
|
||||||
|
|
|
||||||
|
note: expected `usize`, found fn item
|
||||||
|
--> $DIR/issue-109854.rs:4:5
|
||||||
|
|
|
||||||
|
LL | generate_setter,
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
= note: expected type `usize`
|
||||||
|
found fn item `fn() {generate_setter}`
|
||||||
|
note: associated function defined here
|
||||||
|
--> $SRC_DIR/alloc/src/string.rs:LL:COL
|
||||||
|
help: remove the extra arguments
|
||||||
|
|
|
||||||
|
LL - generate_setter,
|
||||||
|
LL + /* usize */,
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0061`.
|
5
tests/ui/suggestions/issue-94171.rs
Normal file
5
tests/ui/suggestions/issue-94171.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
fn L(]{match
|
||||||
|
(; {`
|
||||||
|
//~^^ ERROR mismatched closing delimiter
|
||||||
|
//~^^ ERROR unknown start of token
|
||||||
|
//~ ERROR this file contains an unclosed delimiter
|
36
tests/ui/suggestions/issue-94171.stderr
Normal file
36
tests/ui/suggestions/issue-94171.stderr
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
error: unknown start of token: `
|
||||||
|
--> $DIR/issue-94171.rs:2:5
|
||||||
|
|
|
||||||
|
LL | (; {`
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not
|
||||||
|
|
|
||||||
|
LL | (; {'
|
||||||
|
| ~
|
||||||
|
|
||||||
|
error: mismatched closing delimiter: `]`
|
||||||
|
--> $DIR/issue-94171.rs:1:5
|
||||||
|
|
|
||||||
|
LL | fn L(]{match
|
||||||
|
| ^^ mismatched closing delimiter
|
||||||
|
| |
|
||||||
|
| unclosed delimiter
|
||||||
|
|
||||||
|
error: this file contains an unclosed delimiter
|
||||||
|
--> $DIR/issue-94171.rs:5:52
|
||||||
|
|
|
||||||
|
LL | fn L(]{match
|
||||||
|
| -- unclosed delimiter
|
||||||
|
| |
|
||||||
|
| missing open `[` for this delimiter
|
||||||
|
LL | (; {`
|
||||||
|
| - - unclosed delimiter
|
||||||
|
| |
|
||||||
|
| unclosed delimiter
|
||||||
|
...
|
||||||
|
LL |
|
||||||
|
| ^
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue