@@ -2007,17 +2007,30 @@ impl<'a> Parser<'a> {
20072007 }
20082008 }
20092009
2010- /// Parse ident COLON expr
2010+ /// Parse ident ( COLON expr)?
20112011 pub fn parse_field ( & mut self ) -> PResult < ' a , Field > {
20122012 let lo = self . span . lo ;
2013- let i = self . parse_field_name ( ) ?;
2014- let hi = self . prev_span . hi ;
2015- self . expect ( & token:: Colon ) ?;
2016- let e = self . parse_expr ( ) ?;
2013+ let hi;
2014+
2015+ // Check if a colon exists one ahead. This means we're parsing a fieldname.
2016+ let ( fieldname, expr, is_shorthand) = if self . look_ahead ( 1 , |t| t == & token:: Colon ) {
2017+ let fieldname = self . parse_field_name ( ) ?;
2018+ self . bump ( ) ;
2019+ hi = self . prev_span . hi ;
2020+ ( fieldname, self . parse_expr ( ) ?, false )
2021+ } else {
2022+ let fieldname = self . parse_ident ( ) ?;
2023+ hi = self . prev_span . hi ;
2024+
2025+ // Mimic `x: x` for the `x` field shorthand.
2026+ let path = ast:: Path :: from_ident ( mk_sp ( lo, hi) , fieldname) ;
2027+ ( fieldname, self . mk_expr ( lo, hi, ExprKind :: Path ( None , path) , ThinVec :: new ( ) ) , true )
2028+ } ;
20172029 Ok ( ast:: Field {
2018- ident : spanned ( lo, hi, i) ,
2019- span : mk_sp ( lo, e. span . hi ) ,
2020- expr : e,
2030+ ident : spanned ( lo, hi, fieldname) ,
2031+ span : mk_sp ( lo, expr. span . hi ) ,
2032+ expr : expr,
2033+ is_shorthand : is_shorthand,
20212034 } )
20222035 }
20232036
0 commit comments