1- use crate :: errors;
2-
31use super :: diagnostics:: { dummy_arg, ConsumeClosingDelim } ;
42use super :: ty:: { AllowPlus , RecoverQPath , RecoverReturnSign } ;
53use super :: { AttrWrapper , FollowedByType , ForceCollect , Parser , PathStyle , TrailingToken } ;
4+ use crate :: errors:: { self , MacroExpandsToAdtField } ;
5+ use crate :: fluent_generated as fluent;
66use ast:: StaticItem ;
77use rustc_ast:: ast:: * ;
88use rustc_ast:: ptr:: P ;
@@ -1450,6 +1450,17 @@ impl<'a> Parser<'a> {
14501450 }
14511451 let ident = this. parse_field_ident ( "enum" , vlo) ?;
14521452
1453+ if this. token == token:: Not {
1454+ if let Err ( mut err) = this. unexpected :: < ( ) > ( ) {
1455+ err. note ( fluent:: parse_macro_expands_to_enum_variant) . emit ( ) ;
1456+ }
1457+
1458+ this. bump ( ) ;
1459+ this. parse_delim_args ( ) ?;
1460+
1461+ return Ok ( ( None , TrailingToken :: MaybeComma ) ) ;
1462+ }
1463+
14531464 let struct_def = if this. check ( & token:: OpenDelim ( Delimiter :: Brace ) ) {
14541465 // Parse a struct variant.
14551466 let ( fields, recovered) =
@@ -1477,7 +1488,7 @@ impl<'a> Parser<'a> {
14771488
14781489 Ok ( ( Some ( vr) , TrailingToken :: MaybeComma ) )
14791490 } ,
1480- ) . map_err ( |mut err|{
1491+ ) . map_err ( |mut err| {
14811492 err. help ( "enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`" ) ;
14821493 err
14831494 } )
@@ -1687,7 +1698,8 @@ impl<'a> Parser<'a> {
16871698 self . collect_tokens_trailing_token ( attrs, ForceCollect :: No , |this, attrs| {
16881699 let lo = this. token . span ;
16891700 let vis = this. parse_visibility ( FollowedByType :: No ) ?;
1690- Ok ( ( this. parse_single_struct_field ( adt_ty, lo, vis, attrs) ?, TrailingToken :: None ) )
1701+ this. parse_single_struct_field ( adt_ty, lo, vis, attrs)
1702+ . map ( |field| ( field, TrailingToken :: None ) )
16911703 } )
16921704 }
16931705
@@ -1821,8 +1833,8 @@ impl<'a> Parser<'a> {
18211833 "field names and their types are separated with `:`" ,
18221834 ":" ,
18231835 Applicability :: MachineApplicable ,
1824- ) ;
1825- err . emit ( ) ;
1836+ )
1837+ . emit ( ) ;
18261838 } else {
18271839 return Err ( err) ;
18281840 }
@@ -1839,6 +1851,23 @@ impl<'a> Parser<'a> {
18391851 attrs : AttrVec ,
18401852 ) -> PResult < ' a , FieldDef > {
18411853 let name = self . parse_field_ident ( adt_ty, lo) ?;
1854+ // Parse the macro invocation and recover
1855+ if self . token . kind == token:: Not {
1856+ if let Err ( mut err) = self . unexpected :: < FieldDef > ( ) {
1857+ err. subdiagnostic ( MacroExpandsToAdtField { adt_ty } ) . emit ( ) ;
1858+ self . bump ( ) ;
1859+ self . parse_delim_args ( ) ?;
1860+ return Ok ( FieldDef {
1861+ span : DUMMY_SP ,
1862+ ident : None ,
1863+ vis,
1864+ id : DUMMY_NODE_ID ,
1865+ ty : self . mk_ty ( DUMMY_SP , TyKind :: Err ) ,
1866+ attrs,
1867+ is_placeholder : false ,
1868+ } ) ;
1869+ }
1870+ }
18421871 self . expect_field_ty_separator ( ) ?;
18431872 let ty = self . parse_ty ( ) ?;
18441873 if self . token . kind == token:: Colon && self . look_ahead ( 1 , |tok| tok. kind != token:: Colon ) {
0 commit comments