@@ -54,6 +54,15 @@ use super::recorder::{Recorder, FmtStrs};
5454
5555use util:: ppaux;
5656
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+ }
5766
5867pub struct DumpCsvVisitor < ' l , ' tcx : ' l > {
5968 save_ctxt : SaveContext < ' l , ' tcx > ,
@@ -436,17 +445,14 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
436445 parent_id : NodeId ) {
437446 let field_data = self . save_ctxt . get_field_data ( field, parent_id) ;
438447 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 ) ;
450456 }
451457 }
452458
@@ -483,19 +489,16 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
483489 ty_params : & ast:: Generics ,
484490 body : & ast:: Block ) {
485491 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 ) ;
492498
493499
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 ) ;
499502
500503 for arg in & decl. inputs {
501504 self . visit_ty ( & arg. ty ) ;
@@ -514,18 +517,15 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
514517 expr : & ast:: Expr )
515518 {
516519 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 ) ;
529529
530530 self . visit_ty ( & typ) ;
531531 self . visit_expr ( expr) ;
@@ -591,60 +591,57 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
591591 enum_definition : & ast:: EnumDef ,
592592 ty_params : & ast:: Generics ) {
593593 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 ) ;
622621 }
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 ) ;
641640 }
642641 }
643642 }
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" ) ;
647643 }
644+ self . process_generic_params ( ty_params, item. span , & enum_data. qualname , enum_data. id ) ;
648645 }
649646
650647 fn process_impl ( & mut self ,
@@ -654,38 +651,35 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
654651 typ : & ast:: Ty ,
655652 impl_items : & [ P < ast:: ImplItem > ] ) {
656653 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) => {
671657 self . fmt . ref_str ( recorder:: TypeRef ,
672658 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 ) ;
677662 }
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 ) ;
687674 }
688675
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+
689683 self . process_generic_params ( type_parameters, item. span , "" , item. id ) ;
690684 for impl_item in impl_items {
691685 self . visit_impl_item ( impl_item) ;
@@ -746,16 +740,13 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
746740 fn process_mod ( & mut self ,
747741 item : & ast:: Item ) { // The module in question, represented as an item.
748742 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 ) ;
759750 }
760751
761752 fn process_path ( & mut self ,
@@ -883,16 +874,13 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
883874 self . write_sub_paths_truncated ( path, false ) ;
884875
885876 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 ;
896884
897885 for field in fields {
898886 if generated_code ( field. ident . span ) {
@@ -1269,15 +1257,12 @@ impl<'l, 'tcx, 'v> Visitor<'v> for DumpCsvVisitor<'l, 'tcx> {
12691257 self . visit_expr ( & sub_ex) ;
12701258
12711259 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 ) ;
12811266 } ,
12821267 ast:: ExprTupField ( ref sub_ex, idx) => {
12831268 if generated_code ( sub_ex. span ) {
0 commit comments