Rollup merge of #81416 - estebank:suggestion-span-tweak, r=petrochenkov

Tweak suggestion for missing field in patterns

Account for parser recovered struct and tuple patterns to avoid invalid
suggestion.

Follow up to #81103.
This commit is contained in:
Yuki Okushi 2021-01-28 15:09:13 +09:00 committed by GitHub
commit b8eac50ff5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 19 additions and 30 deletions

View file

@ -1525,24 +1525,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
_ => return err,
},
[.., field] => {
// if last field has a trailing comma, use the comma
// as the span to avoid trailing comma in ultimate
// suggestion (Issue #78511)
let tail = field.span.shrink_to_hi().until(pat.span.shrink_to_hi());
let tail_through_comma = self.tcx.sess.source_map().span_through_char(tail, ',');
let sp = if tail_through_comma == tail {
field.span.shrink_to_hi()
} else {
tail_through_comma
};
(
match pat.kind {
PatKind::Struct(_, [_, ..], _) => ", ",
_ => "",
},
"",
sp,
)
// Account for last field having a trailing comma or parse recovery at the tail of
// the pattern to avoid invalid suggestion (#78511).
let tail = field.span.shrink_to_hi().with_hi(pat.span.hi());
match &pat.kind {
PatKind::Struct(..) => (", ", " }", tail),
_ => return err,
}
}
};
err.span_suggestion(

View file

@ -32,12 +32,12 @@ LL | Struct { a, _ } = Struct { a: 1, b: 2 };
|
help: include the missing field in the pattern
|
LL | Struct { a, b _ } = Struct { a: 1, b: 2 };
| ^^^
LL | Struct { a, b } = Struct { a: 1, b: 2 };
| ^^^^^
help: if you don't care about this missing field, you can explicitly ignore it
|
LL | Struct { a, .. _ } = Struct { a: 1, b: 2 };
| ^^^^
LL | Struct { a, .. } = Struct { a: 1, b: 2 };
| ^^^^^^
error: aborting due to 5 previous errors

View file

@ -7,11 +7,11 @@ LL | Dog { age: x } => {}
help: include the missing field in the pattern
|
LL | Dog { age: x, name } => {}
| ^^^^^^
| ^^^^^^^^
help: if you don't care about this missing field, you can explicitly ignore it
|
LL | Dog { age: x, .. } => {}
| ^^^^
| ^^^^^^
error[E0027]: pattern does not mention field `age`
--> $DIR/E0027.rs:15:9
@ -22,11 +22,11 @@ LL | Dog { name: x, } => {}
help: include the missing field in the pattern
|
LL | Dog { name: x, age } => {}
| ^^^^^
| ^^^^^^^
help: if you don't care about this missing field, you can explicitly ignore it
|
LL | Dog { name: x, .. } => {}
| ^^^^
| ^^^^^^
error[E0027]: pattern does not mention field `age`
--> $DIR/E0027.rs:19:9
@ -37,11 +37,11 @@ LL | Dog { name: x , } => {}
help: include the missing field in the pattern
|
LL | Dog { name: x, age } => {}
| ^^^^^
| ^^^^^^^
help: if you don't care about this missing field, you can explicitly ignore it
|
LL | Dog { name: x, .. } => {}
| ^^^^
| ^^^^^^
error[E0027]: pattern does not mention fields `name`, `age`
--> $DIR/E0027.rs:22:9

View file

@ -19,11 +19,11 @@ LL | let A { x, y } = self.d;
help: include the missing fields in the pattern
|
LL | let A { x, y, b, c } = self.d;
| ^^^^^^
| ^^^^^^^^
help: if you don't care about these missing fields, you can explicitly ignore them
|
LL | let A { x, y, .. } = self.d;
| ^^^^
| ^^^^^^
error: aborting due to 3 previous errors