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())],
|
vec![(left, "(".to_string()), (right.shrink_to_hi(), ")".to_string())],
|
||||||
Applicability::MachineApplicable,
|
Applicability::MachineApplicable,
|
||||||
);
|
);
|
||||||
} else if fields.len() > subpats.len() {
|
} else if fields.len() > subpats.len() && pat_span != DUMMY_SP {
|
||||||
let after_fields_span = if pat_span == DUMMY_SP {
|
let after_fields_span = pat_span.with_hi(pat_span.hi() - BytePos(1)).shrink_to_hi();
|
||||||
pat_span
|
|
||||||
} else {
|
|
||||||
pat_span.with_hi(pat_span.hi() - BytePos(1)).shrink_to_hi()
|
|
||||||
};
|
|
||||||
let all_fields_span = match subpats {
|
let all_fields_span = match subpats {
|
||||||
[] => after_fields_span,
|
[] => after_fields_span,
|
||||||
[field] => field.span,
|
[field] => field.span,
|
||||||
@ -1055,7 +1051,19 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
|
|
||||||
// Check if all the fields in the pattern are wildcards.
|
// Check if all the fields in the pattern are wildcards.
|
||||||
let all_wildcards = subpats.iter().all(|pat| matches!(pat.kind, PatKind::Wild));
|
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(", ");
|
let mut wildcard_sugg = vec!["_"; fields.len() - subpats.len()].join(", ");
|
||||||
if !subpats.is_empty() {
|
if !subpats.is_empty() {
|
||||||
wildcard_sugg = String::from(", ") + &wildcard_sugg;
|
wildcard_sugg = String::from(", ") + &wildcard_sugg;
|
||||||
@ -1080,7 +1088,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
after_fields_span,
|
tail_span,
|
||||||
"use `..` to ignore the rest of the fields",
|
"use `..` to ignore the rest of the fields",
|
||||||
String::from(", .."),
|
String::from(", .."),
|
||||||
Applicability::MaybeIncorrect,
|
Applicability::MaybeIncorrect,
|
||||||
|
@ -122,8 +122,8 @@ LL | Point4( a , _ , _, _) => {}
|
|||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
help: use `..` to ignore the rest of the fields
|
help: use `..` to ignore the rest of the fields
|
||||||
|
|
|
|
||||||
LL | Point4( a , _ , ..) => {}
|
LL | Point4( a, ..) => {}
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
||||||
error: aborting due to 8 previous errors
|
error: aborting due to 8 previous errors
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user