mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-01 15:01:51 +00:00
Account for existing _
field pattern when suggesting ..
Follow up to #80017.
This commit is contained in:
parent
7907345e58
commit
a398994cb2
@ -1041,12 +1041,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
vec![(left, "(".to_string()), (right.shrink_to_hi(), ")".to_string())],
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
} else if fields.len() > subpats.len() {
|
||||
let after_fields_span = if pat_span == DUMMY_SP {
|
||||
pat_span
|
||||
} else {
|
||||
pat_span.with_hi(pat_span.hi() - BytePos(1)).shrink_to_hi()
|
||||
};
|
||||
} else if fields.len() > subpats.len() && pat_span != DUMMY_SP {
|
||||
let after_fields_span = pat_span.with_hi(pat_span.hi() - BytePos(1)).shrink_to_hi();
|
||||
let all_fields_span = match subpats {
|
||||
[] => after_fields_span,
|
||||
[field] => field.span,
|
||||
@ -1055,7 +1051,19 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
|
||||
// Check if all the fields in the pattern are wildcards.
|
||||
let all_wildcards = subpats.iter().all(|pat| matches!(pat.kind, PatKind::Wild));
|
||||
let first_tail_wildcard =
|
||||
subpats.iter().enumerate().fold(None, |acc, (pos, pat)| match (acc, &pat.kind) {
|
||||
(None, PatKind::Wild) => Some(pos),
|
||||
(Some(_), PatKind::Wild) => acc,
|
||||
_ => None,
|
||||
});
|
||||
let tail_span = match first_tail_wildcard {
|
||||
None => after_fields_span,
|
||||
Some(0) => subpats[0].span.to(after_fields_span),
|
||||
Some(pos) => subpats[pos - 1].span.shrink_to_hi().to(after_fields_span),
|
||||
};
|
||||
|
||||
// FIXME: heuristic-based suggestion to check current types for where to add `_`.
|
||||
let mut wildcard_sugg = vec!["_"; fields.len() - subpats.len()].join(", ");
|
||||
if !subpats.is_empty() {
|
||||
wildcard_sugg = String::from(", ") + &wildcard_sugg;
|
||||
@ -1080,7 +1088,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
);
|
||||
} else {
|
||||
err.span_suggestion_verbose(
|
||||
after_fields_span,
|
||||
tail_span,
|
||||
"use `..` to ignore the rest of the fields",
|
||||
String::from(", .."),
|
||||
Applicability::MaybeIncorrect,
|
||||
|
@ -122,8 +122,8 @@ LL | Point4( a , _ , _, _) => {}
|
||||
| ^^^^^^
|
||||
help: use `..` to ignore the rest of the fields
|
||||
|
|
||||
LL | Point4( a , _ , ..) => {}
|
||||
| ^^^^
|
||||
LL | Point4( a, ..) => {}
|
||||
| ^^^^
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user