@@ -54,6 +54,15 @@ use super::recorder::{Recorder, FmtStrs};
54
54
55
55
use util:: ppaux;
56
56
57
+ macro_rules! down_cast_data {
58
+ ( $id: ident, $kind: ident, $this: ident, $sp: expr) => {
59
+ let $id = if let super :: Data :: $kind( data) = $id {
60
+ data
61
+ } else {
62
+ $this. sess. span_bug( $sp, & format!( "unexpected data kind: {:?}" , $id) ) ;
63
+ } ;
64
+ } ;
65
+ }
57
66
58
67
pub struct DumpCsvVisitor < ' l , ' tcx : ' l > {
59
68
save_ctxt : SaveContext < ' l , ' tcx > ,
@@ -436,17 +445,14 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
436
445
parent_id : NodeId ) {
437
446
let field_data = self . save_ctxt . get_field_data ( field, parent_id) ;
438
447
if let Some ( field_data) = field_data {
439
- if let super :: Data :: VariableData ( field_data) = field_data {
440
- self . fmt . field_str ( field. span ,
441
- Some ( field_data. span ) ,
442
- field_data. id ,
443
- & field_data. name ,
444
- & field_data. qualname ,
445
- & field_data. type_value ,
446
- field_data. scope ) ;
447
- } else {
448
- self . sess . span_bug ( field. span , "expected VariableData" ) ;
449
- }
448
+ down_cast_data ! ( field_data, VariableData , self , field. span) ;
449
+ self . fmt . field_str ( field. span ,
450
+ Some ( field_data. span ) ,
451
+ field_data. id ,
452
+ & field_data. name ,
453
+ & field_data. qualname ,
454
+ & field_data. type_value ,
455
+ field_data. scope ) ;
450
456
}
451
457
}
452
458
@@ -483,19 +489,16 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
483
489
ty_params : & ast:: Generics ,
484
490
body : & ast:: Block ) {
485
491
let fn_data = self . save_ctxt . get_item_data ( item) ;
486
- if let super :: Data :: FunctionData ( fn_data) = fn_data {
487
- self . fmt . fn_str ( item. span ,
488
- Some ( fn_data. span ) ,
489
- fn_data. id ,
490
- & fn_data. qualname ,
491
- fn_data. scope ) ;
492
+ down_cast_data ! ( fn_data, FunctionData , self , item . span ) ;
493
+ self . fmt . fn_str ( item. span ,
494
+ Some ( fn_data. span ) ,
495
+ fn_data. id ,
496
+ & fn_data. qualname ,
497
+ fn_data. scope ) ;
492
498
493
499
494
- self . process_formals ( & decl. inputs , & fn_data. qualname ) ;
495
- self . process_generic_params ( ty_params, item. span , & fn_data. qualname , item. id ) ;
496
- } else {
497
- self . sess . span_bug ( item. span , "expected FunctionData" ) ;
498
- }
500
+ self . process_formals ( & decl. inputs , & fn_data. qualname ) ;
501
+ self . process_generic_params ( ty_params, item. span , & fn_data. qualname , item. id ) ;
499
502
500
503
for arg in & decl. inputs {
501
504
self . visit_ty ( & arg. ty ) ;
@@ -514,18 +517,15 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
514
517
expr : & ast:: Expr )
515
518
{
516
519
let var_data = self . save_ctxt . get_item_data ( item) ;
517
- if let super :: Data :: VariableData ( var_data) = var_data {
518
- self . fmt . static_str ( item. span ,
519
- Some ( var_data. span ) ,
520
- var_data. id ,
521
- & var_data. name ,
522
- & var_data. qualname ,
523
- & var_data. value ,
524
- & var_data. type_value ,
525
- var_data. scope ) ;
526
- } else {
527
- self . sess . span_bug ( item. span , "expected VariableData" ) ;
528
- }
520
+ down_cast_data ! ( var_data, VariableData , self , item. span) ;
521
+ self . fmt . static_str ( item. span ,
522
+ Some ( var_data. span ) ,
523
+ var_data. id ,
524
+ & var_data. name ,
525
+ & var_data. qualname ,
526
+ & var_data. value ,
527
+ & var_data. type_value ,
528
+ var_data. scope ) ;
529
529
530
530
self . visit_ty ( & typ) ;
531
531
self . visit_expr ( expr) ;
@@ -591,60 +591,57 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
591
591
enum_definition : & ast:: EnumDef ,
592
592
ty_params : & ast:: Generics ) {
593
593
let enum_data = self . save_ctxt . get_item_data ( item) ;
594
- if let super :: Data :: EnumData ( enum_data) = enum_data {
595
- self . fmt . enum_str ( item. span ,
596
- Some ( enum_data. span ) ,
597
- enum_data. id ,
598
- & enum_data. qualname ,
599
- enum_data. scope ,
600
- & enum_data. value ) ;
601
-
602
- for variant in & enum_definition. variants {
603
- let name = & get_ident ( variant. node . name ) ;
604
- let mut qualname = enum_data. qualname . clone ( ) ;
605
- qualname. push_str ( "::" ) ;
606
- qualname. push_str ( name) ;
607
- let val = self . span . snippet ( variant. span ) ;
608
- match variant. node . kind {
609
- ast:: TupleVariantKind ( ref args) => {
610
- // first ident in span is the variant's name
611
- self . fmt . tuple_variant_str ( variant. span ,
612
- self . span . span_for_first_ident ( variant. span ) ,
613
- variant. node . id ,
614
- name,
615
- & qualname,
616
- & enum_data. qualname ,
617
- & val,
618
- enum_data. id ) ;
619
- for arg in args {
620
- self . visit_ty ( & * arg. ty ) ;
621
- }
594
+ down_cast_data ! ( enum_data, EnumData , self , item. span) ;
595
+ self . fmt . enum_str ( item. span ,
596
+ Some ( enum_data. span ) ,
597
+ enum_data. id ,
598
+ & enum_data. qualname ,
599
+ enum_data. scope ,
600
+ & enum_data. value ) ;
601
+
602
+ for variant in & enum_definition. variants {
603
+ let name = & get_ident ( variant. node . name ) ;
604
+ let mut qualname = enum_data. qualname . clone ( ) ;
605
+ qualname. push_str ( "::" ) ;
606
+ qualname. push_str ( name) ;
607
+ let val = self . span . snippet ( variant. span ) ;
608
+ match variant. node . kind {
609
+ ast:: TupleVariantKind ( ref args) => {
610
+ // first ident in span is the variant's name
611
+ self . fmt . tuple_variant_str ( variant. span ,
612
+ self . span . span_for_first_ident ( variant. span ) ,
613
+ variant. node . id ,
614
+ name,
615
+ & qualname,
616
+ & enum_data. qualname ,
617
+ & val,
618
+ enum_data. id ) ;
619
+ for arg in args {
620
+ self . visit_ty ( & * arg. ty ) ;
622
621
}
623
- ast :: StructVariantKind ( ref struct_def ) => {
624
- let ctor_id = match struct_def . ctor_id {
625
- Some ( node_id ) => node_id ,
626
- None => - 1 ,
627
- } ;
628
- self . fmt . struct_variant_str ( variant . span ,
629
- self . span . span_for_first_ident ( variant. span ) ,
630
- variant . node . id ,
631
- ctor_id ,
632
- & qualname ,
633
- & enum_data . qualname ,
634
- & val ,
635
- enum_data . id ) ;
636
-
637
- for field in & struct_def . fields {
638
- self . process_struct_field_def ( field , variant . node . id ) ;
639
- self . visit_ty ( & * field. node . ty ) ;
640
- }
622
+ }
623
+ ast :: StructVariantKind ( ref struct_def ) => {
624
+ let ctor_id = match struct_def . ctor_id {
625
+ Some ( node_id ) => node_id ,
626
+ None => - 1 ,
627
+ } ;
628
+ self . fmt . struct_variant_str ( variant. span ,
629
+ self . span . span_for_first_ident ( variant . span ) ,
630
+ variant . node . id ,
631
+ ctor_id ,
632
+ & qualname,
633
+ & enum_data . qualname ,
634
+ & val ,
635
+ enum_data . id ) ;
636
+
637
+ for field in & struct_def . fields {
638
+ self . process_struct_field_def ( field, variant . node . id ) ;
639
+ self . visit_ty ( & * field . node . ty ) ;
641
640
}
642
641
}
643
642
}
644
- self . process_generic_params ( ty_params, item. span , & enum_data. qualname , enum_data. id ) ;
645
- } else {
646
- self . sess . span_bug ( item. span , "expected EnumData" ) ;
647
643
}
644
+ self . process_generic_params ( ty_params, item. span , & enum_data. qualname , enum_data. id ) ;
648
645
}
649
646
650
647
fn process_impl ( & mut self ,
@@ -654,38 +651,35 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
654
651
typ : & ast:: Ty ,
655
652
impl_items : & [ P < ast:: ImplItem > ] ) {
656
653
let impl_data = self . save_ctxt . get_item_data ( item) ;
657
- if let super :: Data :: ImplData ( impl_data) = impl_data {
658
- match impl_data. self_ref {
659
- Some ( ref self_ref) => {
660
- self . fmt . ref_str ( recorder:: TypeRef ,
661
- item. span ,
662
- Some ( self_ref. span ) ,
663
- self_ref. ref_id ,
664
- self_ref. scope ) ;
665
- }
666
- None => {
667
- self . visit_ty ( & typ) ;
668
- }
669
- }
670
- if let Some ( ref trait_ref_data) = impl_data. trait_ref {
654
+ down_cast_data ! ( impl_data, ImplData , self , item. span) ;
655
+ match impl_data. self_ref {
656
+ Some ( ref self_ref) => {
671
657
self . fmt . ref_str ( recorder:: TypeRef ,
672
658
item. span ,
673
- Some ( trait_ref_data. span ) ,
674
- trait_ref_data. ref_id ,
675
- trait_ref_data. scope ) ;
676
- visit:: walk_path ( self , & trait_ref. as_ref ( ) . unwrap ( ) . path ) ;
659
+ Some ( self_ref. span ) ,
660
+ self_ref. ref_id ,
661
+ self_ref. scope ) ;
677
662
}
678
-
679
- self . fmt . impl_str ( item. span ,
680
- Some ( impl_data. span ) ,
681
- impl_data. id ,
682
- impl_data. self_ref . map ( |data| data. ref_id ) ,
683
- impl_data. trait_ref . map ( |data| data. ref_id ) ,
684
- impl_data. scope ) ;
685
- } else {
686
- self . sess . span_bug ( item. span , "expected ImplData" ) ;
663
+ None => {
664
+ self . visit_ty ( & typ) ;
665
+ }
666
+ }
667
+ if let Some ( ref trait_ref_data) = impl_data. trait_ref {
668
+ self . fmt . ref_str ( recorder:: TypeRef ,
669
+ item. span ,
670
+ Some ( trait_ref_data. span ) ,
671
+ trait_ref_data. ref_id ,
672
+ trait_ref_data. scope ) ;
673
+ visit:: walk_path ( self , & trait_ref. as_ref ( ) . unwrap ( ) . path ) ;
687
674
}
688
675
676
+ self . fmt . impl_str ( item. span ,
677
+ Some ( impl_data. span ) ,
678
+ impl_data. id ,
679
+ impl_data. self_ref . map ( |data| data. ref_id ) ,
680
+ impl_data. trait_ref . map ( |data| data. ref_id ) ,
681
+ impl_data. scope ) ;
682
+
689
683
self . process_generic_params ( type_parameters, item. span , "" , item. id ) ;
690
684
for impl_item in impl_items {
691
685
self . visit_impl_item ( impl_item) ;
@@ -746,16 +740,13 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
746
740
fn process_mod ( & mut self ,
747
741
item : & ast:: Item ) { // The module in question, represented as an item.
748
742
let mod_data = self . save_ctxt . get_item_data ( item) ;
749
- if let super :: Data :: ModData ( mod_data) = mod_data {
750
- self . fmt . mod_str ( item. span ,
751
- Some ( mod_data. span ) ,
752
- mod_data. id ,
753
- & mod_data. qualname ,
754
- mod_data. scope ,
755
- & mod_data. filename ) ;
756
- } else {
757
- self . sess . span_bug ( item. span , "expected ModData" ) ;
758
- }
743
+ down_cast_data ! ( mod_data, ModData , self , item. span) ;
744
+ self . fmt . mod_str ( item. span ,
745
+ Some ( mod_data. span ) ,
746
+ mod_data. id ,
747
+ & mod_data. qualname ,
748
+ mod_data. scope ,
749
+ & mod_data. filename ) ;
759
750
}
760
751
761
752
fn process_path ( & mut self ,
@@ -883,16 +874,13 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
883
874
self . write_sub_paths_truncated ( path, false ) ;
884
875
885
876
let struct_lit_data = self . save_ctxt . get_expr_data ( ex) ;
886
- let struct_def = if let super :: Data :: TypeRefData ( struct_lit_data) = struct_lit_data {
887
- self . fmt . ref_str ( recorder:: TypeRef ,
888
- ex. span ,
889
- Some ( struct_lit_data. span ) ,
890
- struct_lit_data. ref_id ,
891
- struct_lit_data. scope ) ;
892
- struct_lit_data. ref_id
893
- } else {
894
- self . sess . span_bug ( ex. span , "expected TypeRefData" ) ;
895
- } ;
877
+ down_cast_data ! ( struct_lit_data, TypeRefData , self , ex. span) ;
878
+ self . fmt . ref_str ( recorder:: TypeRef ,
879
+ ex. span ,
880
+ Some ( struct_lit_data. span ) ,
881
+ struct_lit_data. ref_id ,
882
+ struct_lit_data. scope ) ;
883
+ let struct_def = struct_lit_data. ref_id ;
896
884
897
885
for field in fields {
898
886
if generated_code ( field. ident . span ) {
@@ -1269,15 +1257,12 @@ impl<'l, 'tcx, 'v> Visitor<'v> for DumpCsvVisitor<'l, 'tcx> {
1269
1257
self . visit_expr ( & sub_ex) ;
1270
1258
1271
1259
let field_data = self . save_ctxt . get_expr_data ( ex) ;
1272
- if let super :: Data :: VariableRefData ( field_data) = field_data {
1273
- self . fmt . ref_str ( recorder:: VarRef ,
1274
- ex. span ,
1275
- Some ( field_data. span ) ,
1276
- field_data. ref_id ,
1277
- field_data. scope ) ;
1278
- } else {
1279
- self . sess . span_bug ( ex. span , "expected VariableRefData" ) ;
1280
- }
1260
+ down_cast_data ! ( field_data, VariableRefData , self , ex. span) ;
1261
+ self . fmt . ref_str ( recorder:: VarRef ,
1262
+ ex. span ,
1263
+ Some ( field_data. span ) ,
1264
+ field_data. ref_id ,
1265
+ field_data. scope ) ;
1281
1266
} ,
1282
1267
ast:: ExprTupField ( ref sub_ex, idx) => {
1283
1268
if generated_code ( sub_ex. span ) {
0 commit comments