Skip to content

Commit

Permalink
Rollup merge of rust-lang#109782 - WaffleLapkin:nocommawhenremovingar…
Browse files Browse the repository at this point in the history
…guments, 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.
  • Loading branch information
matthiaskrgr authored Apr 6, 2023
2 parents ffffa2d + 48c1641 commit e7376ef
Show file tree
Hide file tree
Showing 5 changed files with 173 additions and 6 deletions.
39 changes: 34 additions & 5 deletions compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ use rustc_middle::ty::visit::TypeVisitableExt;
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;
Expand Down Expand Up @@ -894,8 +894,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
};

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];
Expand Down Expand Up @@ -941,10 +946,34 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
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 {
Expand Down
20 changes: 20 additions & 0 deletions tests/ui/argument-suggestions/issue-109425.fixed
Original file line number Diff line number Diff line change
@@ -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 changes: 20 additions & 0 deletions tests/ui/argument-suggestions/issue-109425.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 98 additions & 0 deletions tests/ui/argument-suggestions/issue-109425.stderr
Original file line number Diff line number Diff line change
@@ -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`.
2 changes: 1 addition & 1 deletion tests/ui/suggestions/issue-109396.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit e7376ef

Please sign in to comment.