@@ -3256,39 +3256,48 @@ impl<'a> Parser<'a> {
3256
3256
break ;
3257
3257
}
3258
3258
3259
- let bind_type = if self . eat_keyword ( keywords:: Mut ) {
3260
- BindByValue ( MutMutable )
3261
- } else if self . eat_keyword ( keywords:: Ref ) {
3262
- BindByRef ( self . parse_mutability ( ) )
3263
- } else {
3264
- BindByValue ( MutImmutable )
3265
- } ;
3266
-
3267
- let fieldname = self . parse_ident ( ) ;
3268
-
3269
- let ( subpat, is_shorthand) = if self . check ( & token:: Colon ) {
3270
- match bind_type {
3271
- BindByRef ( ..) | BindByValue ( MutMutable ) => {
3272
- let token_str = self . this_token_to_string ( ) ;
3273
- self . fatal ( & format ! ( "unexpected `{}`" ,
3274
- token_str) [ ] )
3275
- }
3276
- _ => { }
3277
- }
3278
-
3259
+ // Check if a colon exists one ahead. This means we're parsing a fieldname.
3260
+ let ( subpat, fieldname, is_shorthand) = if self . look_ahead ( 1 , |t| t == & token:: Colon ) {
3261
+ // Parsing a pattern of the form "fieldname: pat"
3262
+ let fieldname = self . parse_ident ( ) ;
3279
3263
self . bump ( ) ;
3280
3264
let pat = self . parse_pat ( ) ;
3281
3265
hi = pat. span . hi ;
3282
- ( pat, false )
3266
+ ( pat, fieldname , false )
3283
3267
} else {
3268
+ // Parsing a pattern of the form "(box) (ref) (mut) fieldname"
3269
+ let is_box = self . eat_keyword ( keywords:: Box ) ;
3270
+ let boxed_span_lo = self . span . lo ;
3271
+ let is_ref = self . eat_keyword ( keywords:: Ref ) ;
3272
+ let is_mut = self . eat_keyword ( keywords:: Mut ) ;
3273
+ let fieldname = self . parse_ident ( ) ;
3284
3274
hi = self . last_span . hi ;
3285
- let fieldpath = codemap:: Spanned { span : self . last_span , node : fieldname} ;
3286
- ( P ( ast:: Pat {
3275
+
3276
+ let bind_type = match ( is_ref, is_mut) {
3277
+ ( true , true ) => BindByRef ( MutMutable ) ,
3278
+ ( true , false ) => BindByRef ( MutImmutable ) ,
3279
+ ( false , true ) => BindByValue ( MutMutable ) ,
3280
+ ( false , false ) => BindByValue ( MutImmutable ) ,
3281
+ } ;
3282
+ let fieldpath = codemap:: Spanned { span : self . last_span , node : fieldname} ;
3283
+ let fieldpat = P ( ast:: Pat {
3287
3284
id : ast:: DUMMY_NODE_ID ,
3288
3285
node : PatIdent ( bind_type, fieldpath, None ) ,
3289
- span : self . last_span
3290
- } ) , true )
3286
+ span : mk_sp ( boxed_span_lo, hi) ,
3287
+ } ) ;
3288
+
3289
+ let subpat = if is_box {
3290
+ P ( ast:: Pat {
3291
+ id : ast:: DUMMY_NODE_ID ,
3292
+ node : PatBox ( fieldpat) ,
3293
+ span : mk_sp ( lo, hi) ,
3294
+ } )
3295
+ } else {
3296
+ fieldpat
3297
+ } ;
3298
+ ( subpat, fieldname, true )
3291
3299
} ;
3300
+
3292
3301
fields. push ( codemap:: Spanned { span : mk_sp ( lo, hi) ,
3293
3302
node : ast:: FieldPat { ident : fieldname,
3294
3303
pat : subpat,
0 commit comments