1
Fork 0

save-analysis: give better info for Unions

This commit is contained in:
Nick Cameron 2017-11-06 14:56:43 +13:00
parent 44990e5b14
commit 099f96472f

View file

@ -521,39 +521,41 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
item: &'l ast::Item, item: &'l ast::Item,
def: &'l ast::VariantData, def: &'l ast::VariantData,
ty_params: &'l ast::Generics) { ty_params: &'l ast::Generics) {
debug!("process_struct {:?} {:?}", item, item.span);
let name = item.ident.to_string(); let name = item.ident.to_string();
let qualname = format!("::{}", self.tcx.node_path_str(item.id)); let qualname = format!("::{}", self.tcx.node_path_str(item.id));
let sub_span = self.span.sub_span_after_keyword(item.span, keywords::Struct); let (kind, keyword) = match item.node {
let (value, fields) = ast::ItemKind::Struct(_, _) => (DefKind::Struct, keywords::Struct),
if let ast::ItemKind::Struct(ast::VariantData::Struct(ref fields, _), _) = item.node ast::ItemKind::Union(_, _) => (DefKind::Union, keywords::Union),
{ _ => unreachable!(),
let include_priv_fields = !self.save_ctxt.config.pub_only; };
let fields_str = fields
.iter() let sub_span = self.span.sub_span_after_keyword(item.span, keyword);
.enumerate() let (value, fields) = match item.node {
.filter_map(|(i, f)| { ast::ItemKind::Struct(ast::VariantData::Struct(ref fields, _), _) |
if include_priv_fields || f.vis == ast::Visibility::Public { ast::ItemKind::Union(ast::VariantData::Struct(ref fields, _), _) => {
f.ident.map(|i| i.to_string()).or_else(|| Some(i.to_string())) let include_priv_fields = !self.save_ctxt.config.pub_only;
} else { let fields_str = fields
None .iter()
} .enumerate()
}) .filter_map(|(i, f)| {
.collect::<Vec<_>>() if include_priv_fields || f.vis == ast::Visibility::Public {
.join(", "); f.ident.map(|i| i.to_string()).or_else(|| Some(i.to_string()))
let value = format!("{} {{ {} }}", name, fields_str); } else {
(value, fields.iter().map(|f| ::id_from_node_id(f.id, &self.save_ctxt)).collect()) None
} else { }
(String::new(), vec![]) })
.collect::<Vec<_>>()
.join(", ");
let value = format!("{} {{ {} }}", name, fields_str);
(value, fields.iter().map(|f| ::id_from_node_id(f.id, &self.save_ctxt)).collect())
}
_ => (String::new(), vec![])
}; };
if !self.span.filter_generated(sub_span, item.span) { if !self.span.filter_generated(sub_span, item.span) {
let span = self.span_from_span(sub_span.expect("No span found for struct")); let span = self.span_from_span(sub_span.expect("No span found for struct"));
let kind = match item.node {
ast::ItemKind::Struct(_, _) => DefKind::Struct,
ast::ItemKind::Union(_, _) => DefKind::Union,
_ => unreachable!(),
};
self.dumper.dump_def(item.vis == ast::Visibility::Public, Def { self.dumper.dump_def(item.vis == ast::Visibility::Public, Def {
kind, kind,
id: ::id_from_node_id(item.id, &self.save_ctxt), id: ::id_from_node_id(item.id, &self.save_ctxt),