From 87f0c1f33789df39db871857055a2d7d533da47f Mon Sep 17 00:00:00 2001 From: csmoe <35686186+csmoe@users.noreply.github.com> Date: Mon, 23 Jul 2018 22:16:53 +0800 Subject: [PATCH] Suggest to take and ignore args while closure args count mismatching --- src/librustc/traits/error_reporting.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs index df26ac670601..1c502b661030 100644 --- a/src/librustc/traits/error_reporting.rs +++ b/src/librustc/traits/error_reporting.rs @@ -1048,7 +1048,24 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { err.span_label(span, format!( "expected {} that takes {}", kind, expected_str)); if let Some(found_span) = found_span { - 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(Suppose the user just wants to ignore args in this case). + // like `|_, _|` for closure with 2 expected args. + if found_args.is_empty() && is_closure { + let mut underscores = "_".repeat(expected_args.len()) + .split("") + .filter(|s| !s.is_empty()) + .collect::>() + .join(", "); + err.span_suggestion( + found_span, + "consider changing this to", + format!("|{}|", underscores), + ); + } else { + err.span_label(found_span, format!("takes {}", found_str)); + } + if let &[ArgKind::Tuple(_, ref fields)] = &found_args[..] { if fields.len() == expected_args.len() {