Skip to content

Commit 92d6676

Browse files
committed
save-analysis: use a macro for 'downcasting'
1 parent 788fddd commit 92d6676

File tree

2 files changed

+132
-139
lines changed

2 files changed

+132
-139
lines changed

src/librustc_trans/save/dump_csv.rs

+124-139
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ use super::recorder::{Recorder, FmtStrs};
5454

5555
use 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

5867
pub 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

Comments
 (0)