lint based on closure pipe span
This commit is contained in:
parent
4ec0ba9545
commit
052bdff8fb
2 changed files with 17 additions and 1 deletions
|
|
@ -1092,13 +1092,27 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
|||
if let Some(found_span) = found_span {
|
||||
err.span_label(found_span, format!("takes {}", found_str));
|
||||
|
||||
// move |_| { ... }
|
||||
// ^^^^^^^^-- def_span
|
||||
//
|
||||
// move |_| { ... }
|
||||
// ^^^^^-- prefix
|
||||
let prefix_span = self.tcx.sess.source_map().span_until_char(found_span, '|');
|
||||
// move |_| { ... }
|
||||
// ^^^-- pipe_span
|
||||
let pipe_span = if let Some(span) = found_span.trim_start(prefix_span) {
|
||||
span
|
||||
} else {
|
||||
found_span
|
||||
};
|
||||
|
||||
// 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 underscores = vec!["_"; expected_args.len()].join(", ");
|
||||
err.span_suggestion_with_applicability(
|
||||
found_span,
|
||||
pipe_span,
|
||||
&format!(
|
||||
"consider changing the closure to take and ignore the expected argument{}",
|
||||
if expected_args.len() < 2 {
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@ fn main() {
|
|||
//~^ ERROR closure is expected to take
|
||||
f(|| panic!());
|
||||
//~^ ERROR closure is expected to take
|
||||
f(move || panic!());
|
||||
//~^ ERROR closure is expected to take
|
||||
|
||||
let _it = vec![1, 2, 3].into_iter().enumerate().map(|i, x| i);
|
||||
//~^ ERROR closure is expected to take
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue