From 3b2b7f67ee3b504d267a9791ea76c1230fdbc666 Mon Sep 17 00:00:00 2001 From: topecongiro Date: Sun, 5 Nov 2017 20:30:28 +0900 Subject: [PATCH] Add StructParts to reduce the number of args --- src/items.rs | 120 ++++++++++++++++++++++++++++--------------------- src/visitor.rs | 37 ++------------- 2 files changed, 73 insertions(+), 84 deletions(-) diff --git a/src/items.rs b/src/items.rs index c9baa3a06168..3e79cf3c1cea 100644 --- a/src/items.rs +++ b/src/items.rs @@ -411,6 +411,13 @@ impl<'a> FmtVisitor<'a> { None } + pub fn visit_struct(&mut self, struct_parts: &StructParts) { + let is_tuple = struct_parts.def.is_tuple(); + let rewrite = format_struct(&self.get_context(), struct_parts, self.block_indent, None) + .map(|s| if is_tuple { s + ";" } else { s }); + self.push_rewrite(struct_parts.span, rewrite); + } + pub fn visit_enum( &mut self, ident: ast::Ident, @@ -529,12 +536,7 @@ impl<'a> FmtVisitor<'a> { // FIXME: Should limit the width, as we have a trailing comma format_struct( &context, - "", - field.node.name, - &ast::Visibility::Inherited, - &field.node.data, - None, - field.span, + &StructParts::from_variant(field), indent, Some(self.config.struct_variant_width()), )? @@ -855,40 +857,62 @@ fn rewrite_trait_ref( } } -pub fn format_struct( - context: &RewriteContext, - item_name: &str, +pub struct StructParts<'a> { + prefix: &'a str, ident: ast::Ident, - vis: &ast::Visibility, - struct_def: &ast::VariantData, - generics: Option<&ast::Generics>, + vis: &'a ast::Visibility, + def: &'a ast::VariantData, + generics: Option<&'a ast::Generics>, span: Span, +} + +impl<'a> StructParts<'a> { + fn format_header(&self) -> String { + format_header(self.prefix, self.ident, self.vis) + } + + fn from_variant(variant: &'a ast::Variant) -> Self { + StructParts { + prefix: "", + ident: variant.node.name, + vis: &ast::Visibility::Inherited, + def: &variant.node.data, + generics: None, + span: variant.span, + } + } + + pub fn from_item(item: &'a ast::Item) -> Self { + let (prefix, def, generics) = match item.node { + ast::ItemKind::Struct(ref def, ref generics) => ("struct ", def, generics), + ast::ItemKind::Union(ref def, ref generics) => ("union ", def, generics), + _ => unreachable!(), + }; + StructParts { + prefix: prefix, + ident: item.ident, + vis: &item.vis, + def: def, + generics: Some(generics), + span: item.span, + } + } +} + +fn format_struct( + context: &RewriteContext, + struct_parts: &StructParts, offset: Indent, one_line_width: Option, ) -> Option { - match *struct_def { - ast::VariantData::Unit(..) => Some(format_unit_struct(item_name, ident, vis)), - ast::VariantData::Tuple(ref fields, _) => format_tuple_struct( - context, - item_name, - ident, - vis, - fields, - generics, - span, - offset, - ), - ast::VariantData::Struct(ref fields, _) => format_struct_struct( - context, - item_name, - ident, - vis, - fields, - generics, - span, - offset, - one_line_width, - ), + match *struct_parts.def { + ast::VariantData::Unit(..) => Some(format_unit_struct(struct_parts)), + ast::VariantData::Tuple(ref fields, _) => { + format_tuple_struct(context, struct_parts, fields, offset) + } + ast::VariantData::Struct(ref fields, _) => { + format_struct_struct(context, struct_parts, fields, offset, one_line_width) + } } } @@ -1050,30 +1074,27 @@ pub fn format_trait(context: &RewriteContext, item: &ast::Item, offset: Indent) } } -fn format_unit_struct(item_name: &str, ident: ast::Ident, vis: &ast::Visibility) -> String { - format!("{};", format_header(item_name, ident, vis)) +fn format_unit_struct(p: &StructParts) -> String { + format!("{};", format_header(p.prefix, p.ident, p.vis)) } pub fn format_struct_struct( context: &RewriteContext, - item_name: &str, - ident: ast::Ident, - vis: &ast::Visibility, + struct_parts: &StructParts, fields: &[ast::StructField], - generics: Option<&ast::Generics>, - span: Span, offset: Indent, one_line_width: Option, ) -> Option { let mut result = String::with_capacity(1024); + let span = struct_parts.span; - let header_str = format_header(item_name, ident, vis); + let header_str = struct_parts.format_header(); result.push_str(&header_str); let header_hi = span.lo() + BytePos(header_str.len() as u32); let body_lo = context.codemap.span_after(span, "{"); - let generics_str = match generics { + let generics_str = match struct_parts.generics { Some(g) => format_generics( context, g, @@ -1174,17 +1195,14 @@ fn get_bytepos_after_visibility( fn format_tuple_struct( context: &RewriteContext, - item_name: &str, - ident: ast::Ident, - vis: &ast::Visibility, + struct_parts: &StructParts, fields: &[ast::StructField], - generics: Option<&ast::Generics>, - span: Span, offset: Indent, ) -> Option { let mut result = String::with_capacity(1024); + let span = struct_parts.span; - let header_str = format_header(item_name, ident, vis); + let header_str = struct_parts.format_header(); result.push_str(&header_str); let body_lo = if fields.is_empty() { @@ -1207,7 +1225,7 @@ fn format_tuple_struct( } }; - let where_clause_str = match generics { + let where_clause_str = match struct_parts.generics { Some(generics) => { let budget = context.budget(last_line_width(&header_str)); let shape = Shape::legacy(budget, offset); diff --git a/src/visitor.rs b/src/visitor.rs index 5b654b07336c..adcdb120ee37 100644 --- a/src/visitor.rs +++ b/src/visitor.rs @@ -23,9 +23,8 @@ use comment::{contains_comment, recover_missing_comment_in_span, remove_trailing CodeCharKind, CommentCodeSlices, FindUncommented}; use comment::rewrite_comment; use config::{BraceStyle, Config}; -use items::{format_impl, format_struct, format_struct_struct, format_trait, - rewrite_associated_impl_type, rewrite_associated_type, rewrite_static, - rewrite_type_alias, FnSig, StaticParts}; +use items::{format_impl, format_trait, rewrite_associated_impl_type, rewrite_associated_type, + rewrite_static, rewrite_type_alias, FnSig, StaticParts, StructParts}; use lists::{itemize_list, write_list, DefinitiveListTactic, ListFormatting, SeparatorPlace, SeparatorTactic}; use macros::{rewrite_macro, MacroPosition}; @@ -345,22 +344,8 @@ impl<'a> FmtVisitor<'a> { let rw = rewrite_extern_crate(&self.get_context(), item); self.push_rewrite(item.span, rw); } - ast::ItemKind::Struct(ref def, ref generics) => { - let rewrite = format_struct( - &self.get_context(), - "struct ", - item.ident, - &item.vis, - def, - Some(generics), - item.span, - self.block_indent, - None, - ).map(|s| match *def { - ast::VariantData::Tuple(..) => s + ";", - _ => s, - }); - self.push_rewrite(item.span, rewrite); + ast::ItemKind::Struct(..) | ast::ItemKind::Union(..) => { + self.visit_struct(&StructParts::from_item(item)); } ast::ItemKind::Enum(ref def, ref generics) => { self.format_missing_with_indent(source!(self, item.span).lo()); @@ -429,20 +414,6 @@ impl<'a> FmtVisitor<'a> { ); self.push_rewrite(item.span, rewrite); } - ast::ItemKind::Union(ref def, ref generics) => { - let rewrite = format_struct_struct( - &self.get_context(), - "union ", - item.ident, - &item.vis, - def.fields(), - Some(generics), - item.span, - self.block_indent, - None, - ); - self.push_rewrite(item.span, rewrite); - } ast::ItemKind::GlobalAsm(..) => { let snippet = Some(self.snippet(item.span)); self.push_rewrite(item.span, snippet);