From 82d8dd2f4bdcd61b08c6952e4e6ebdf4db70b299 Mon Sep 17 00:00:00 2001 From: topecongiro Date: Sat, 28 Apr 2018 13:59:03 +0900 Subject: [PATCH] Factor out a formatting routine for empty struct and tuple --- src/items.rs | 35 +++++++++++++++++++++++++++++++++++ src/utils.rs | 10 ++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/items.rs b/src/items.rs index 1924d881127b..e6351a3aa154 100644 --- a/src/items.rs +++ b/src/items.rs @@ -1242,6 +1242,41 @@ fn get_bytepos_after_visibility(vis: &ast::Visibility, default_span: Span) -> By } } +// Format tuple or struct without any fields. We need to make sure that the comments +// inside the delimiters are preserved. +fn format_empty_struct_or_tuple( + context: &RewriteContext, + span: Span, + offset: Indent, + result: &mut String, + opener: &str, + closer: &str, +) { + // 3 = " {}" or "();" + let used_width = last_line_used_width(&result, offset.width()) + 3; + if used_width > context.config.max_width() { + result.push_str(&offset.to_string_with_newline(context.config)) + } + result.push_str(opener); + match rewrite_missing_comment(span, Shape::indented(offset, context.config), context) { + Some(ref s) if s.is_empty() => (), + Some(ref s) => { + if !is_single_line(s) || first_line_contains_single_line_comment(s) { + let nested_indent_str = offset + .block_indent(context.config) + .to_string_with_newline(context.config); + result.push_str(&nested_indent_str); + } + result.push_str(s); + if last_line_contains_single_line_comment(s) { + result.push_str(&offset.to_string_with_newline(context.config)); + } + } + None => result.push_str(context.snippet(span)), + } + result.push_str(closer); +} + fn format_tuple_struct( context: &RewriteContext, struct_parts: &StructParts, diff --git a/src/utils.rs b/src/utils.rs index 2493c9a5c743..9ed1df35a429 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -133,6 +133,16 @@ pub fn outer_attributes(attrs: &[ast::Attribute]) -> Vec { filter_attributes(attrs, ast::AttrStyle::Outer) } +#[inline] +pub fn is_single_line(s: &str) -> bool { + s.chars().find(|&c| c == '\n').is_none() +} + +#[inline] +pub fn first_line_contains_single_line_comment(s: &str) -> bool { + s.lines().next().map_or(false, |l| l.contains("//")) +} + #[inline] pub fn last_line_contains_single_line_comment(s: &str) -> bool { s.lines().last().map_or(false, |l| l.contains("//"))