Rollup merge of #52647 - csmoe:closure_arg_ignore, r=estebank
Suggest to take and ignore args while closure args count mismatching Closes #52473
This commit is contained in:
commit
662fb069fd
@ -1050,6 +1050,30 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
|||||||
if let Some(found_span) = found_span {
|
if let Some(found_span) = found_span {
|
||||||
err.span_label(found_span, format!("takes {}", found_str));
|
err.span_label(found_span, format!("takes {}", found_str));
|
||||||
|
|
||||||
|
// Suggest to take and ignore the arguments with expected_args_length `_`s if
|
||||||
|
// found arguments is empty (assume the user just wants to ignore args in this case).
|
||||||
|
// For example, if `expected_args_length` is 2, suggest `|_, _|`.
|
||||||
|
if found_args.is_empty() && is_closure {
|
||||||
|
let mut underscores = "_".repeat(expected_args.len())
|
||||||
|
.split("")
|
||||||
|
.filter(|s| !s.is_empty())
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ");
|
||||||
|
err.span_suggestion_with_applicability(
|
||||||
|
found_span,
|
||||||
|
&format!(
|
||||||
|
"consider changing the closure to take and ignore the expected argument{}",
|
||||||
|
if expected_args.len() < 2 {
|
||||||
|
""
|
||||||
|
} else {
|
||||||
|
"s"
|
||||||
|
}
|
||||||
|
),
|
||||||
|
format!("|{}|", underscores),
|
||||||
|
Applicability::MachineApplicable,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if let &[ArgKind::Tuple(_, ref fields)] = &found_args[..] {
|
if let &[ArgKind::Tuple(_, ref fields)] = &found_args[..] {
|
||||||
if fields.len() == expected_args.len() {
|
if fields.len() == expected_args.len() {
|
||||||
let sugg = fields.iter()
|
let sugg = fields.iter()
|
||||||
|
@ -5,6 +5,10 @@ LL | [1, 2, 3].sort_by(|| panic!());
|
|||||||
| ^^^^^^^ -- takes 0 arguments
|
| ^^^^^^^ -- takes 0 arguments
|
||||||
| |
|
| |
|
||||||
| expected closure that takes 2 arguments
|
| expected closure that takes 2 arguments
|
||||||
|
help: consider changing the closure to take and ignore the expected arguments
|
||||||
|
|
|
||||||
|
LL | [1, 2, 3].sort_by(|_, _| panic!());
|
||||||
|
| ^^^^^^
|
||||||
|
|
||||||
error[E0593]: closure is expected to take 2 arguments, but it takes 1 argument
|
error[E0593]: closure is expected to take 2 arguments, but it takes 1 argument
|
||||||
--> $DIR/closure-arg-count.rs:17:15
|
--> $DIR/closure-arg-count.rs:17:15
|
||||||
@ -51,6 +55,10 @@ note: required by `f`
|
|||||||
|
|
|
|
||||||
LL | fn f<F: Fn<usize>>(_: F) {}
|
LL | fn f<F: Fn<usize>>(_: F) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
help: consider changing the closure to take and ignore the expected argument
|
||||||
|
|
|
||||||
|
LL | f(|_| panic!());
|
||||||
|
| ^^^
|
||||||
|
|
||||||
error[E0593]: closure is expected to take a single 2-tuple as argument, but it takes 2 distinct arguments
|
error[E0593]: closure is expected to take a single 2-tuple as argument, but it takes 2 distinct arguments
|
||||||
--> $DIR/closure-arg-count.rs:26:53
|
--> $DIR/closure-arg-count.rs:26:53
|
||||||
|
Loading…
Reference in New Issue
Block a user