@@ -318,6 +318,26 @@ fn create_iter_bytes_method(cx: ext_ctxt,
318
318
}
319
319
}
320
320
321
+ fn create_subpatterns ( cx : ext_ctxt ,
322
+ span : span ,
323
+ prefix : ~str ,
324
+ n : uint )
325
+ -> ~[ @pat] {
326
+ let subpats = dvec:: DVec ( ) ;
327
+ for uint:: range( 0 , n) |_i| {
328
+ // Create the subidentifier.
329
+ let index = subpats. len ( ) . to_str ( ) ;
330
+ let ident = cx. ident_of ( prefix + index) ;
331
+
332
+ // Create the subpattern.
333
+ let subpath = build:: mk_raw_path ( span, ~[ ident ] ) ;
334
+ let subpat = pat_ident ( bind_by_ref ( m_imm) , subpath, None ) ;
335
+ let subpat = build:: mk_pat ( cx, span, move subpat) ;
336
+ subpats. push ( subpat) ;
337
+ }
338
+ return dvec:: unwrap ( move subpats) ;
339
+ }
340
+
321
341
fn create_enum_variant_pattern ( cx : ext_ctxt ,
322
342
span : span ,
323
343
variant : & variant ,
@@ -330,25 +350,37 @@ fn create_enum_variant_pattern(cx: ext_ctxt,
330
350
return build:: mk_pat_ident ( cx, span, variant_ident) ;
331
351
}
332
352
333
- let subpats = dvec:: DVec ( ) ;
334
- for variant_args. each |_variant_arg| {
335
- // Create the subidentifier.
336
- let index = subpats. len ( ) . to_str ( ) ;
337
- let ident = cx. ident_of ( prefix + index) ;
338
-
339
- // Create the subpattern.
340
- let subpath = build:: mk_raw_path ( span, ~[ ident ] ) ;
341
- let subpat = pat_ident ( bind_by_ref ( m_imm) , subpath, None ) ;
342
- let subpat = build:: mk_pat ( cx, span, move subpat) ;
343
- subpats. push ( subpat) ;
344
- }
345
-
346
353
let matching_path = build:: mk_raw_path ( span, ~[ variant_ident ] ) ;
347
- let subpats = dvec:: unwrap ( move subpats) ;
354
+ let subpats = create_subpatterns ( cx,
355
+ span,
356
+ prefix,
357
+ variant_args. len ( ) ) ;
358
+
348
359
return build:: mk_pat_enum ( cx, span, matching_path, move subpats) ;
349
360
}
350
- struct_variant_kind( * ) => {
351
- cx. span_unimpl ( span, ~"struct variants for `deriving`") ;
361
+ struct_variant_kind( struct_def) => {
362
+ let matching_path = build:: mk_raw_path ( span, ~[ variant_ident ] ) ;
363
+ let subpats = create_subpatterns ( cx,
364
+ span,
365
+ prefix,
366
+ struct_def. fields . len ( ) ) ;
367
+
368
+ let field_pats = dvec:: DVec ( ) ;
369
+ for struct_def. fields. eachi |i, struct_field| {
370
+ let ident = match struct_field. node . kind {
371
+ named_field( ident, _, _) => ident,
372
+ unnamed_field => {
373
+ cx. span_bug ( span, ~"unexpected unnamed field") ;
374
+ }
375
+ } ;
376
+ field_pats. push ( { ident: ident, pat: subpats[ i] } ) ;
377
+ }
378
+ let field_pats = dvec:: unwrap ( move field_pats) ;
379
+
380
+ return build:: mk_pat_struct ( cx,
381
+ span,
382
+ matching_path,
383
+ move field_pats) ;
352
384
}
353
385
enum_variant_kind( * ) => {
354
386
cx. span_unimpl ( span, ~"enum variants for `deriving`") ;
0 commit comments