Skip to content

Commit b153e2b

Browse files
authored
Rollup merge of rust-lang#109782 - WaffleLapkin:nocommawhenremovingarguments, r=oli-obk
Don't leave a comma at the start of argument list when removing arguments Fixes rust-lang#109425 Quite a dirty hack, but at least it works ig.
2 parents c86c933 + 48c1641 commit b153e2b

File tree

5 files changed

+173
-6
lines changed

5 files changed

+173
-6
lines changed

compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs

+34-5
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use rustc_middle::ty::visit::TypeVisitableExt;
3131
use rustc_middle::ty::{self, IsSuggestable, Ty};
3232
use rustc_session::Session;
3333
use rustc_span::symbol::{kw, Ident};
34-
use rustc_span::{self, sym, Span};
34+
use rustc_span::{self, sym, BytePos, Span};
3535
use rustc_trait_selection::traits::{self, ObligationCauseCode, SelectionContext};
3636

3737
use std::iter;
@@ -894,8 +894,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
894894
};
895895

896896
let mut errors = errors.into_iter().peekable();
897+
let mut only_extras_so_far = errors
898+
.peek()
899+
.map_or(false, |first| matches!(first, Error::Extra(arg_idx) if arg_idx.index() == 0));
897900
let mut suggestions = vec![];
898901
while let Some(error) = errors.next() {
902+
only_extras_so_far &= matches!(error, Error::Extra(_));
903+
899904
match error {
900905
Error::Invalid(provided_idx, expected_idx, compatibility) => {
901906
let (formal_ty, expected_ty) = formal_and_expected_inputs[expected_idx];
@@ -941,10 +946,34 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
941946
if arg_idx.index() > 0
942947
&& let Some((_, prev)) = provided_arg_tys
943948
.get(ProvidedIdx::from_usize(arg_idx.index() - 1)
944-
) {
945-
// Include previous comma
946-
span = prev.shrink_to_hi().to(span);
947-
}
949+
) {
950+
// Include previous comma
951+
span = prev.shrink_to_hi().to(span);
952+
}
953+
954+
// Is last argument for deletion in a row starting from the 0-th argument?
955+
// Then delete the next comma, so we are not left with `f(, ...)`
956+
//
957+
// fn f() {}
958+
// - f(0, 1,)
959+
// + f()
960+
if only_extras_so_far
961+
&& errors
962+
.peek()
963+
.map_or(true, |next_error| !matches!(next_error, Error::Extra(_)))
964+
{
965+
let next = provided_arg_tys
966+
.get(arg_idx + 1)
967+
.map(|&(_, sp)| sp)
968+
.unwrap_or_else(|| {
969+
// Subtract one to move before `)`
970+
call_expr.span.with_lo(call_expr.span.hi() - BytePos(1))
971+
});
972+
973+
// Include next comma
974+
span = span.until(next);
975+
}
976+
948977
suggestions.push((span, String::new()));
949978

950979
suggestion_text = match suggestion_text {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// run-rustfix
2+
3+
fn f() {}
4+
fn i(_: u32) {}
5+
fn is(_: u32, _: &str) {}
6+
fn s(_: &str) {}
7+
8+
fn main() {
9+
// code expected suggestion
10+
f(); // f()
11+
//~^ error: this function takes 0 arguments but 2 arguments were supplied
12+
i(0,); // i(0,)
13+
//~^ error: this function takes 1 argument but 3 arguments were supplied
14+
i(0); // i(0)
15+
//~^ error: this function takes 1 argument but 3 arguments were supplied
16+
is(0, ""); // is(0, "")
17+
//~^ error: this function takes 2 arguments but 4 arguments were supplied
18+
s(""); // s("")
19+
//~^ error: this function takes 1 argument but 3 arguments were supplied
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// run-rustfix
2+
3+
fn f() {}
4+
fn i(_: u32) {}
5+
fn is(_: u32, _: &str) {}
6+
fn s(_: &str) {}
7+
8+
fn main() {
9+
// code expected suggestion
10+
f(0, 1,); // f()
11+
//~^ error: this function takes 0 arguments but 2 arguments were supplied
12+
i(0, 1, 2,); // i(0,)
13+
//~^ error: this function takes 1 argument but 3 arguments were supplied
14+
i(0, 1, 2); // i(0)
15+
//~^ error: this function takes 1 argument but 3 arguments were supplied
16+
is(0, 1, 2, ""); // is(0, "")
17+
//~^ error: this function takes 2 arguments but 4 arguments were supplied
18+
s(0, 1, ""); // s("")
19+
//~^ error: this function takes 1 argument but 3 arguments were supplied
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
error[E0061]: this function takes 0 arguments but 2 arguments were supplied
2+
--> $DIR/issue-109425.rs:10:5
3+
|
4+
LL | f(0, 1,); // f()
5+
| ^ - - unexpected argument of type `{integer}`
6+
| |
7+
| unexpected argument of type `{integer}`
8+
|
9+
note: function defined here
10+
--> $DIR/issue-109425.rs:3:4
11+
|
12+
LL | fn f() {}
13+
| ^
14+
help: remove the extra arguments
15+
|
16+
LL - f(0, 1,); // f()
17+
LL + f(); // f()
18+
|
19+
20+
error[E0061]: this function takes 1 argument but 3 arguments were supplied
21+
--> $DIR/issue-109425.rs:12:5
22+
|
23+
LL | i(0, 1, 2,); // i(0,)
24+
| ^ - - unexpected argument of type `{integer}`
25+
| |
26+
| unexpected argument of type `{integer}`
27+
|
28+
note: function defined here
29+
--> $DIR/issue-109425.rs:4:4
30+
|
31+
LL | fn i(_: u32) {}
32+
| ^ ------
33+
help: remove the extra arguments
34+
|
35+
LL - i(0, 1, 2,); // i(0,)
36+
LL + i(0,); // i(0,)
37+
|
38+
39+
error[E0061]: this function takes 1 argument but 3 arguments were supplied
40+
--> $DIR/issue-109425.rs:14:5
41+
|
42+
LL | i(0, 1, 2); // i(0)
43+
| ^ - - unexpected argument of type `{integer}`
44+
| |
45+
| unexpected argument of type `{integer}`
46+
|
47+
note: function defined here
48+
--> $DIR/issue-109425.rs:4:4
49+
|
50+
LL | fn i(_: u32) {}
51+
| ^ ------
52+
help: remove the extra arguments
53+
|
54+
LL - i(0, 1, 2); // i(0)
55+
LL + i(0); // i(0)
56+
|
57+
58+
error[E0061]: this function takes 2 arguments but 4 arguments were supplied
59+
--> $DIR/issue-109425.rs:16:5
60+
|
61+
LL | is(0, 1, 2, ""); // is(0, "")
62+
| ^^ - - unexpected argument of type `{integer}`
63+
| |
64+
| unexpected argument of type `{integer}`
65+
|
66+
note: function defined here
67+
--> $DIR/issue-109425.rs:5:4
68+
|
69+
LL | fn is(_: u32, _: &str) {}
70+
| ^^ ------ -------
71+
help: remove the extra arguments
72+
|
73+
LL - is(0, 1, 2, ""); // is(0, "")
74+
LL + is(0, ""); // is(0, "")
75+
|
76+
77+
error[E0061]: this function takes 1 argument but 3 arguments were supplied
78+
--> $DIR/issue-109425.rs:18:5
79+
|
80+
LL | s(0, 1, ""); // s("")
81+
| ^ - - unexpected argument of type `{integer}`
82+
| |
83+
| unexpected argument of type `{integer}`
84+
|
85+
note: function defined here
86+
--> $DIR/issue-109425.rs:6:4
87+
|
88+
LL | fn s(_: &str) {}
89+
| ^ -------
90+
help: remove the extra arguments
91+
|
92+
LL - s(0, 1, ""); // s("")
93+
LL + s(""); // s("")
94+
|
95+
96+
error: aborting due to 5 previous errors
97+
98+
For more information about this error, try `rustc --explain E0061`.

tests/ui/suggestions/issue-109396.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ note: function defined here
2525
help: remove the extra arguments
2626
|
2727
LL - file.as_raw_fd(),
28-
LL + ,
28+
LL + );
2929
|
3030

3131
error: aborting due to 2 previous errors

0 commit comments

Comments
 (0)