diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/items.rs | 35 | ||||
| -rw-r--r-- | src/utils.rs | 10 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/items.rs b/src/items.rs index 1924d881127..e6351a3aa15 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 2493c9a5c74..9ed1df35a42 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -134,6 +134,16 @@ pub fn outer_attributes(attrs: &[ast::Attribute]) -> Vec<ast::Attribute> { } #[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("//")) } |
