fix #102806, suggest use .. to fill in the rest of the fields of Struct

This commit is contained in:
yukang 2022-10-13 23:27:17 +08:00
parent 6718ea1cff
commit 1e25882944
5 changed files with 103 additions and 3 deletions

View File

@ -112,6 +112,9 @@ parser_missing_semicolon_before_array = expected `;`, found `[`
parser_invalid_block_macro_segment = cannot use a `block` macro fragment here
.label = the `block` fragment is within this context
parser_expect_dotdot_not_dotdotdot = expected `..`, found `...`
.suggestion = use `..` to fill in the rest of the fields
parser_if_expression_missing_then_block = this `if` expression is missing a block after the condition
.add_then_block = add a block here
.condition_possibly_unfinished = this binary operation is possibly unfinished

View File

@ -368,6 +368,15 @@ pub(crate) struct MissingSemicolonBeforeArray {
pub semicolon: Span,
}
#[derive(Diagnostic)]
#[diag(parser_expect_dotdot_not_dotdotdot)]
pub(crate) struct MissingDotDot {
#[primary_span]
pub token_span: Span,
#[suggestion_verbose(applicability = "maybe-incorrect", code = "..")]
pub sugg_span: Span,
}
#[derive(Diagnostic)]
#[diag(parser_invalid_block_macro_segment)]
pub(crate) struct InvalidBlockMacroSegment {

View File

@ -20,9 +20,9 @@ use crate::errors::{
InvalidNumLiteralSuffix, LabeledLoopInBreak, LeadingPlusNotSupported, LeftArrowOperator,
LifetimeInBorrowExpression, MacroInvocationWithQualifiedPath, MalformedLoopLabel,
MatchArmBodyWithoutBraces, MatchArmBodyWithoutBracesSugg, MissingCommaAfterMatchArm,
MissingInInForLoop, MissingInInForLoopSub, MissingSemicolonBeforeArray, NoFieldsForFnCall,
NotAsNegationOperator, NotAsNegationOperatorSub, OctalFloatLiteralNotSupported,
OuterAttributeNotAllowedOnIfElse, ParenthesesWithStructFields,
MissingDotDot, MissingInInForLoop, MissingInInForLoopSub, MissingSemicolonBeforeArray,
NoFieldsForFnCall, NotAsNegationOperator, NotAsNegationOperatorSub,
OctalFloatLiteralNotSupported, OuterAttributeNotAllowedOnIfElse, ParenthesesWithStructFields,
RequireColonAfterLabeledExpression, ShiftInterpretedAsGeneric, StructLiteralNotAllowedHere,
StructLiteralNotAllowedHereSugg, TildeAsUnaryOperator, UnexpectedTokenAfterLabel,
UnexpectedTokenAfterLabelSugg, WrapExpressionInParentheses,
@ -2897,6 +2897,21 @@ impl<'a> Parser<'a> {
}
self.recover_struct_comma_after_dotdot(exp_span);
break;
} else if self.token == token::DotDotDot {
// suggest `..v` instead of `...v`
let snapshot = self.create_snapshot_for_diagnostic();
let span = self.token.span;
self.bump();
match self.parse_expr() {
Ok(_p) => {
self.sess.emit_err(MissingDotDot { token_span: span, sugg_span: span });
break;
}
Err(inner_err) => {
inner_err.cancel();
self.restore_snapshot(snapshot);
}
}
}
let recovery_field = self.find_struct_error_after_field_looking_code();

View File

@ -0,0 +1,22 @@
#![allow(dead_code)]
struct V3 {
x: f32,
y: f32,
z: f32,
}
fn pz(v: V3) {
let _ = V3 { z: 0.0, ...v};
//~^ ERROR expected `..`
//~| ERROR missing fields `x` and `y` in initializer of `V3`
let _ = V3 { z: 0.0, ... };
//~^ expected identifier
//~| ERROR missing fields `x` and `y` in initializer of `V3`
let _ = V3 { z: 0.0, ...Default::default() };
//~^ ERROR expected `..`
//~| ERROR missing fields `x` and `y` in initializer of `V3`
}
fn main() {}

View File

@ -0,0 +1,51 @@
error: expected `..`, found `...`
--> $DIR/issue-102806.rs:10:26
|
LL | let _ = V3 { z: 0.0, ...v};
| ^^^
|
help: use `..` to fill in the rest of the fields
|
LL | let _ = V3 { z: 0.0, ..v};
| ~~
error: expected identifier, found `...`
--> $DIR/issue-102806.rs:13:26
|
LL | let _ = V3 { z: 0.0, ... };
| -- ^^^ expected identifier
| |
| while parsing this struct
error: expected `..`, found `...`
--> $DIR/issue-102806.rs:17:26
|
LL | let _ = V3 { z: 0.0, ...Default::default() };
| ^^^
|
help: use `..` to fill in the rest of the fields
|
LL | let _ = V3 { z: 0.0, ..Default::default() };
| ~~
error[E0063]: missing fields `x` and `y` in initializer of `V3`
--> $DIR/issue-102806.rs:10:13
|
LL | let _ = V3 { z: 0.0, ...v};
| ^^ missing `x` and `y`
error[E0063]: missing fields `x` and `y` in initializer of `V3`
--> $DIR/issue-102806.rs:13:13
|
LL | let _ = V3 { z: 0.0, ... };
| ^^ missing `x` and `y`
error[E0063]: missing fields `x` and `y` in initializer of `V3`
--> $DIR/issue-102806.rs:17:13
|
LL | let _ = V3 { z: 0.0, ...Default::default() };
| ^^ missing `x` and `y`
error: aborting due to 6 previous errors
For more information about this error, try `rustc --explain E0063`.