add a label to struct/enum/union ident name
This commit is contained in:
parent
e123a61297
commit
4f44dee501
22 changed files with 91 additions and 16 deletions
|
@ -1318,7 +1318,8 @@ impl<'a> Parser<'a> {
|
|||
(vec![], false)
|
||||
} else {
|
||||
self.parse_delim_comma_seq(Delimiter::Brace, |p| p.parse_enum_variant()).map_err(
|
||||
|e| {
|
||||
|mut e| {
|
||||
e.span_label(id.span, "while parsing this enum");
|
||||
self.recover_stmt();
|
||||
e
|
||||
},
|
||||
|
@ -1345,7 +1346,8 @@ impl<'a> Parser<'a> {
|
|||
|
||||
let struct_def = if this.check(&token::OpenDelim(Delimiter::Brace)) {
|
||||
// Parse a struct variant.
|
||||
let (fields, recovered) = this.parse_record_struct_body("struct", false)?;
|
||||
let (fields, recovered) =
|
||||
this.parse_record_struct_body("struct", ident.span, false)?;
|
||||
VariantData::Struct(fields, recovered)
|
||||
} else if this.check(&token::OpenDelim(Delimiter::Parenthesis)) {
|
||||
VariantData::Tuple(this.parse_tuple_struct_body()?, DUMMY_NODE_ID)
|
||||
|
@ -1399,8 +1401,11 @@ impl<'a> Parser<'a> {
|
|||
VariantData::Unit(DUMMY_NODE_ID)
|
||||
} else {
|
||||
// If we see: `struct Foo<T> where T: Copy { ... }`
|
||||
let (fields, recovered) =
|
||||
self.parse_record_struct_body("struct", generics.where_clause.has_where_token)?;
|
||||
let (fields, recovered) = self.parse_record_struct_body(
|
||||
"struct",
|
||||
class_name.span,
|
||||
generics.where_clause.has_where_token,
|
||||
)?;
|
||||
VariantData::Struct(fields, recovered)
|
||||
}
|
||||
// No `where` so: `struct Foo<T>;`
|
||||
|
@ -1408,8 +1413,11 @@ impl<'a> Parser<'a> {
|
|||
VariantData::Unit(DUMMY_NODE_ID)
|
||||
// Record-style struct definition
|
||||
} else if self.token == token::OpenDelim(Delimiter::Brace) {
|
||||
let (fields, recovered) =
|
||||
self.parse_record_struct_body("struct", generics.where_clause.has_where_token)?;
|
||||
let (fields, recovered) = self.parse_record_struct_body(
|
||||
"struct",
|
||||
class_name.span,
|
||||
generics.where_clause.has_where_token,
|
||||
)?;
|
||||
VariantData::Struct(fields, recovered)
|
||||
// Tuple-style struct definition with optional where-clause.
|
||||
} else if self.token == token::OpenDelim(Delimiter::Parenthesis) {
|
||||
|
@ -1438,12 +1446,18 @@ impl<'a> Parser<'a> {
|
|||
|
||||
let vdata = if self.token.is_keyword(kw::Where) {
|
||||
generics.where_clause = self.parse_where_clause()?;
|
||||
let (fields, recovered) =
|
||||
self.parse_record_struct_body("union", generics.where_clause.has_where_token)?;
|
||||
let (fields, recovered) = self.parse_record_struct_body(
|
||||
"union",
|
||||
class_name.span,
|
||||
generics.where_clause.has_where_token,
|
||||
)?;
|
||||
VariantData::Struct(fields, recovered)
|
||||
} else if self.token == token::OpenDelim(Delimiter::Brace) {
|
||||
let (fields, recovered) =
|
||||
self.parse_record_struct_body("union", generics.where_clause.has_where_token)?;
|
||||
let (fields, recovered) = self.parse_record_struct_body(
|
||||
"union",
|
||||
class_name.span,
|
||||
generics.where_clause.has_where_token,
|
||||
)?;
|
||||
VariantData::Struct(fields, recovered)
|
||||
} else {
|
||||
let token_str = super::token_descr(&self.token);
|
||||
|
@ -1459,6 +1473,7 @@ impl<'a> Parser<'a> {
|
|||
fn parse_record_struct_body(
|
||||
&mut self,
|
||||
adt_ty: &str,
|
||||
ident_span: Span,
|
||||
parsed_where: bool,
|
||||
) -> PResult<'a, (Vec<FieldDef>, /* recovered */ bool)> {
|
||||
let mut fields = Vec::new();
|
||||
|
@ -1473,6 +1488,7 @@ impl<'a> Parser<'a> {
|
|||
match field {
|
||||
Ok(field) => fields.push(field),
|
||||
Err(mut err) => {
|
||||
err.span_label(ident_span, format!("while parsing this {adt_ty}"));
|
||||
err.emit();
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue