diff --git a/src/items.rs b/src/items.rs index c4c55c841a6..5595b41607b 100644 --- a/src/items.rs +++ b/src/items.rs @@ -634,18 +634,13 @@ 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.config.item_brace_style, + enum_def.variants.is_empty(), self.block_indent, self.block_indent.block_indent(self.config), mk_sp(span.lo, body_start)) @@ -820,24 +815,23 @@ 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, "{", + self.config.item_brace_style, + fields.is_empty(), offset, offset + header_str.len(), mk_sp(span.lo, body_lo))) } - None => format!("{}{{", separator), + None => if self.config.item_brace_style == BraceStyle::AlwaysNextLine && + !fields.is_empty() { + format!("\n{}{{", self.block_indent.to_string(self.config)) + } else { + " {".to_owned() + }, }; result.push_str(&generics_str); @@ -969,8 +963,9 @@ impl<'a> FmtVisitor<'a> { fn format_generics(&self, generics: &ast::Generics, opener: &str, - separator: &str, terminator: &str, + brace_style: BraceStyle, + force_same_line_brace: bool, offset: Indent, generics_offset: Indent, span: Span) @@ -985,11 +980,22 @@ impl<'a> FmtVisitor<'a> { terminator, Some(span.hi))); result.push_str(&where_clause_str); - result.push('\n'); - result.push_str(&self.block_indent.to_string(self.config)); + if !force_same_line_brace && + (brace_style == BraceStyle::SameLineWhere || + brace_style == BraceStyle::AlwaysNextLine) { + result.push('\n'); + result.push_str(&self.block_indent.to_string(self.config)); + } else { + result.push(' '); + } result.push_str(opener); } else { - result.push_str(separator); + if !force_same_line_brace && brace_style == BraceStyle::AlwaysNextLine { + result.push('\n'); + result.push_str(&self.block_indent.to_string(self.config)); + } else { + result.push(' '); + } result.push_str(opener); } diff --git a/tests/source/item-brace-style-next-line.rs b/tests/source/item-brace-style-always-next-line.rs similarity index 100% rename from tests/source/item-brace-style-next-line.rs rename to tests/source/item-brace-style-always-next-line.rs diff --git a/tests/source/item-brace-style-same-line.rs b/tests/source/item-brace-style-prefer-same-line.rs similarity index 100% rename from tests/source/item-brace-style-same-line.rs rename to tests/source/item-brace-style-prefer-same-line.rs diff --git a/tests/source/item-brace-style-same-line-where.rs b/tests/source/item-brace-style-same-line-where.rs new file mode 100644 index 00000000000..7b2a95d3245 --- /dev/null +++ b/tests/source/item-brace-style-same-line-where.rs @@ -0,0 +1,31 @@ +// rustfmt-item_brace_style: SameLineWhere + +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 {} + + enum A where T: Copy { + A, + } + + struct B where T: Copy { + b: i32, + } + + // For empty enums and structs, the brace remains on the same line. + enum C where T: Copy {} + + struct D where T: Copy {} +} diff --git a/tests/target/item-brace-style-next-line.rs b/tests/target/item-brace-style-always-next-line.rs similarity index 88% rename from tests/target/item-brace-style-next-line.rs rename to tests/target/item-brace-style-always-next-line.rs index a5c24102d92..48dcebc0263 100644 --- a/tests/target/item-brace-style-next-line.rs +++ b/tests/target/item-brace-style-always-next-line.rs @@ -30,10 +30,8 @@ mod M { // For empty enums and structs, the brace remains on the same line. enum C - where T: Copy - {} + where T: Copy {} struct D - where T: Copy - {} + where T: Copy {} } diff --git a/tests/target/item-brace-style-same-line.rs b/tests/target/item-brace-style-prefer-same-line.rs similarity index 100% rename from tests/target/item-brace-style-same-line.rs rename to tests/target/item-brace-style-prefer-same-line.rs diff --git a/tests/target/item-brace-style-same-line-where.rs b/tests/target/item-brace-style-same-line-where.rs new file mode 100644 index 00000000000..cdcd813fda4 --- /dev/null +++ b/tests/target/item-brace-style-same-line-where.rs @@ -0,0 +1,35 @@ +// rustfmt-item_brace_style: SameLineWhere + +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 {} + + enum A + where T: Copy + { + A, + } + + struct B + where T: Copy + { + b: i32, + } + + // For empty enums and structs, the brace remains on the same line. + enum C + where T: Copy {} + + struct D + where T: Copy {} +}