@@ -2007,17 +2007,30 @@ impl<'a> Parser<'a> {
2007
2007
}
2008
2008
}
2009
2009
2010
- /// Parse ident COLON expr
2010
+ /// Parse ident ( COLON expr)?
2011
2011
pub fn parse_field ( & mut self ) -> PResult < ' a , Field > {
2012
2012
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
+ } ;
2017
2029
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,
2021
2034
} )
2022
2035
}
2023
2036
0 commit comments