From 8658774ad2252f00559d88f1fd8884197041f307 Mon Sep 17 00:00:00 2001 From: Pavel Sountsov Date: Sun, 15 Nov 2015 11:55:18 -0800 Subject: [PATCH] Implement initial option for brace style for non-fn items. --- src/config.rs | 1 + src/items.rs | 20 ++++++++++++++++++-- tests/source/item-brace-style.rs | 16 ++++++++++++++++ tests/target/item-brace-style.rs | 18 ++++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 tests/source/item-brace-style.rs create mode 100644 tests/target/item-brace-style.rs diff --git a/src/config.rs b/src/config.rs index dcf0816335b..7a64ab15916 100644 --- a/src/config.rs +++ b/src/config.rs @@ -302,4 +302,5 @@ create_config! { take_source_hints: bool, true, "Retain some formatting characteristics from the source code"; hard_tabs: bool, false, "Use tab characters for indentation, spaces for alignment"; wrap_comments: bool, false, "Break comments to fit on the line"; + item_brace_style: BraceStyle, BraceStyle::SameLineWhere, "Brace style for structs and enums"; } diff --git a/src/items.rs b/src/items.rs index 19a2a118e8b..c4c55c841a6 100644 --- a/src/items.rs +++ b/src/items.rs @@ -634,10 +634,17 @@ impl<'a> FmtVisitor<'a> { let header_str = self.format_header("enum ", ident, vis); self.buffer.push_str(&header_str); + let separator = if self.config.item_brace_style == BraceStyle::AlwaysNextLine && + !enum_def.variants.is_empty() { + format!("\n{}", self.block_indent.to_string(self.config)) + } else { + " ".to_owned() + }; let enum_snippet = self.snippet(span); let body_start = span.lo + BytePos(enum_snippet.find_uncommented("{").unwrap() as u32 + 1); let generics_str = self.format_generics(generics, "{", + &separator, "{", self.block_indent, self.block_indent.block_indent(self.config), @@ -813,16 +820,24 @@ impl<'a> FmtVisitor<'a> { let body_lo = span_after(span, "{", self.codemap); + let separator = if self.config.item_brace_style == BraceStyle::AlwaysNextLine && + !fields.is_empty() { + format!("\n{}", self.block_indent.to_string(self.config)) + } else { + " ".to_owned() + }; + let generics_str = match generics { Some(g) => { try_opt!(self.format_generics(g, "{", + &separator, "{", offset, offset + header_str.len(), mk_sp(span.lo, body_lo))) } - None => " {".to_owned(), + None => format!("{}{{", separator), }; result.push_str(&generics_str); @@ -954,6 +969,7 @@ impl<'a> FmtVisitor<'a> { fn format_generics(&self, generics: &ast::Generics, opener: &str, + separator: &str, terminator: &str, offset: Indent, generics_offset: Indent, @@ -973,7 +989,7 @@ impl<'a> FmtVisitor<'a> { result.push_str(&self.block_indent.to_string(self.config)); result.push_str(opener); } else { - result.push(' '); + result.push_str(separator); result.push_str(opener); } diff --git a/tests/source/item-brace-style.rs b/tests/source/item-brace-style.rs new file mode 100644 index 00000000000..37b02f0940a --- /dev/null +++ b/tests/source/item-brace-style.rs @@ -0,0 +1,16 @@ +// rustfmt-item_brace_style: AlwaysNextLine + +mod M { + enum A { + A, + } + + struct B { + b: i32, + } + + // For empty enums and structs, the brace remains on the same line. + enum C {} + + struct D {} +} diff --git a/tests/target/item-brace-style.rs b/tests/target/item-brace-style.rs new file mode 100644 index 00000000000..006d6b4d3bf --- /dev/null +++ b/tests/target/item-brace-style.rs @@ -0,0 +1,18 @@ +// rustfmt-item_brace_style: AlwaysNextLine + +mod M { + enum A + { + A, + } + + struct B + { + b: i32, + } + + // For empty enums and structs, the brace remains on the same line. + enum C {} + + struct D {} +}