Rollup merge of #109782 - WaffleLapkin:nocommawhenremovingarguments, r=oli-obk

Don't leave a comma at the start of argument list when removing arguments

Fixes #109425

Quite a dirty hack, but at least it works ig.
This commit is contained in:
Matthias Krüger 2023-04-06 18:42:58 +02:00 committed by GitHub
commit b153e2bd12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 173 additions and 6 deletions

View File

@ -31,7 +31,7 @@
use rustc_middle::ty::{self, IsSuggestable, Ty};
use rustc_session::Session;
use rustc_span::symbol::{kw, Ident};
use rustc_span::{self, sym, Span};
use rustc_span::{self, sym, BytePos, Span};
use rustc_trait_selection::traits::{self, ObligationCauseCode, SelectionContext};
use std::iter;
@ -894,8 +894,13 @@ enum SuggestionText {
};
let mut errors = errors.into_iter().peekable();
let mut only_extras_so_far = errors
.peek()
.map_or(false, |first| matches!(first, Error::Extra(arg_idx) if arg_idx.index() == 0));
let mut suggestions = vec![];
while let Some(error) = errors.next() {
only_extras_so_far &= matches!(error, Error::Extra(_));
match error {
Error::Invalid(provided_idx, expected_idx, compatibility) => {
let (formal_ty, expected_ty) = formal_and_expected_inputs[expected_idx];
@ -945,6 +950,30 @@ enum SuggestionText {
// Include previous comma
span = prev.shrink_to_hi().to(span);
}
// Is last argument for deletion in a row starting from the 0-th argument?
// Then delete the next comma, so we are not left with `f(, ...)`
//
// fn f() {}
// - f(0, 1,)
// + f()
if only_extras_so_far
&& errors
.peek()
.map_or(true, |next_error| !matches!(next_error, Error::Extra(_)))
{
let next = provided_arg_tys
.get(arg_idx + 1)
.map(|&(_, sp)| sp)
.unwrap_or_else(|| {
// Subtract one to move before `)`
call_expr.span.with_lo(call_expr.span.hi() - BytePos(1))
});
// Include next comma
span = span.until(next);
}
suggestions.push((span, String::new()));
suggestion_text = match suggestion_text {

View File

@ -0,0 +1,20 @@
// run-rustfix
fn f() {}
fn i(_: u32) {}
fn is(_: u32, _: &str) {}
fn s(_: &str) {}
fn main() {
// code expected suggestion
f(); // f()
//~^ error: this function takes 0 arguments but 2 arguments were supplied
i(0,); // i(0,)
//~^ error: this function takes 1 argument but 3 arguments were supplied
i(0); // i(0)
//~^ error: this function takes 1 argument but 3 arguments were supplied
is(0, ""); // is(0, "")
//~^ error: this function takes 2 arguments but 4 arguments were supplied
s(""); // s("")
//~^ error: this function takes 1 argument but 3 arguments were supplied
}

View File

@ -0,0 +1,20 @@
// run-rustfix
fn f() {}
fn i(_: u32) {}
fn is(_: u32, _: &str) {}
fn s(_: &str) {}
fn main() {
// code expected suggestion
f(0, 1,); // f()
//~^ error: this function takes 0 arguments but 2 arguments were supplied
i(0, 1, 2,); // i(0,)
//~^ error: this function takes 1 argument but 3 arguments were supplied
i(0, 1, 2); // i(0)
//~^ error: this function takes 1 argument but 3 arguments were supplied
is(0, 1, 2, ""); // is(0, "")
//~^ error: this function takes 2 arguments but 4 arguments were supplied
s(0, 1, ""); // s("")
//~^ error: this function takes 1 argument but 3 arguments were supplied
}

View File

@ -0,0 +1,98 @@
error[E0061]: this function takes 0 arguments but 2 arguments were supplied
--> $DIR/issue-109425.rs:10:5
|
LL | f(0, 1,); // f()
| ^ - - unexpected argument of type `{integer}`
| |
| unexpected argument of type `{integer}`
|
note: function defined here
--> $DIR/issue-109425.rs:3:4
|
LL | fn f() {}
| ^
help: remove the extra arguments
|
LL - f(0, 1,); // f()
LL + f(); // f()
|
error[E0061]: this function takes 1 argument but 3 arguments were supplied
--> $DIR/issue-109425.rs:12:5
|
LL | i(0, 1, 2,); // i(0,)
| ^ - - unexpected argument of type `{integer}`
| |
| unexpected argument of type `{integer}`
|
note: function defined here
--> $DIR/issue-109425.rs:4:4
|
LL | fn i(_: u32) {}
| ^ ------
help: remove the extra arguments
|
LL - i(0, 1, 2,); // i(0,)
LL + i(0,); // i(0,)
|
error[E0061]: this function takes 1 argument but 3 arguments were supplied
--> $DIR/issue-109425.rs:14:5
|
LL | i(0, 1, 2); // i(0)
| ^ - - unexpected argument of type `{integer}`
| |
| unexpected argument of type `{integer}`
|
note: function defined here
--> $DIR/issue-109425.rs:4:4
|
LL | fn i(_: u32) {}
| ^ ------
help: remove the extra arguments
|
LL - i(0, 1, 2); // i(0)
LL + i(0); // i(0)
|
error[E0061]: this function takes 2 arguments but 4 arguments were supplied
--> $DIR/issue-109425.rs:16:5
|
LL | is(0, 1, 2, ""); // is(0, "")
| ^^ - - unexpected argument of type `{integer}`
| |
| unexpected argument of type `{integer}`
|
note: function defined here
--> $DIR/issue-109425.rs:5:4
|
LL | fn is(_: u32, _: &str) {}
| ^^ ------ -------
help: remove the extra arguments
|
LL - is(0, 1, 2, ""); // is(0, "")
LL + is(0, ""); // is(0, "")
|
error[E0061]: this function takes 1 argument but 3 arguments were supplied
--> $DIR/issue-109425.rs:18:5
|
LL | s(0, 1, ""); // s("")
| ^ - - unexpected argument of type `{integer}`
| |
| unexpected argument of type `{integer}`
|
note: function defined here
--> $DIR/issue-109425.rs:6:4
|
LL | fn s(_: &str) {}
| ^ -------
help: remove the extra arguments
|
LL - s(0, 1, ""); // s("")
LL + s(""); // s("")
|
error: aborting due to 5 previous errors
For more information about this error, try `rustc --explain E0061`.

View File

@ -25,7 +25,7 @@ note: function defined here
help: remove the extra arguments
|
LL - file.as_raw_fd(),
LL + ,
LL + );
|
error: aborting due to 2 previous errors