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:
commit
b153e2bd12
@ -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];
|
||||
@ -941,10 +946,34 @@ enum SuggestionText {
|
||||
if arg_idx.index() > 0
|
||||
&& let Some((_, prev)) = provided_arg_tys
|
||||
.get(ProvidedIdx::from_usize(arg_idx.index() - 1)
|
||||
) {
|
||||
// Include previous comma
|
||||
span = prev.shrink_to_hi().to(span);
|
||||
}
|
||||
) {
|
||||
// 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 {
|
||||
|
20
tests/ui/argument-suggestions/issue-109425.fixed
Normal file
20
tests/ui/argument-suggestions/issue-109425.fixed
Normal 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
|
||||
}
|
20
tests/ui/argument-suggestions/issue-109425.rs
Normal file
20
tests/ui/argument-suggestions/issue-109425.rs
Normal 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
|
||||
}
|
98
tests/ui/argument-suggestions/issue-109425.stderr
Normal file
98
tests/ui/argument-suggestions/issue-109425.stderr
Normal 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`.
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user