Recover comments between 'impl' and the opening brace

This commit is contained in:
topecongiro 2017-08-28 00:16:54 +09:00
parent 6bbc6b54de
commit fa7c4d5030

View File

@ -517,8 +517,10 @@ pub fn format_impl(
where_span_end: Option<BytePos>,
) -> Option<String> {
if let ast::ItemKind::Impl(_, _, _, ref generics, _, ref self_ty, ref items) = item.node {
let mut result = String::new();
let mut result = String::with_capacity(128);
let ref_and_type = try_opt!(format_impl_ref_and_type(context, item, offset));
let indent_str = offset.to_string(context.config);
let sep = format!("\n{}", &indent_str);
result.push_str(&ref_and_type);
let where_budget = if result.contains('\n') {
@ -543,6 +545,24 @@ pub fn format_impl(
option,
));
// If there is no where clause, we may have missing comments between the trait name and
// the opening brace.
if generics.where_clause.predicates.is_empty() {
if let Some(hi) = where_span_end {
match recover_missing_comment_in_span(
mk_sp(self_ty.span.hi, hi),
Shape::indented(offset, context.config),
context,
last_line_width(&result),
) {
Some(ref missing_comment) if !missing_comment.is_empty() => {
result.push_str(missing_comment);
}
_ => (),
}
}
}
if try_opt!(is_impl_single_line(
context,
&items,
@ -551,9 +571,8 @@ pub fn format_impl(
&item,
)) {
result.push_str(&where_clause_str);
if where_clause_str.contains('\n') {
let white_space = offset.to_string(context.config);
result.push_str(&format!("\n{}{{\n{}}}", &white_space, &white_space));
if where_clause_str.contains('\n') || last_line_contains_single_line_comment(&result) {
result.push_str(&format!("{}{{{}}}", &sep, &sep));
} else {
result.push_str(" {}");
}
@ -569,14 +588,11 @@ pub fn format_impl(
result.push_str(&where_clause_str);
match context.config.item_brace_style() {
BraceStyle::AlwaysNextLine => {
result.push('\n');
result.push_str(&offset.to_string(context.config));
}
_ if last_line_contains_single_line_comment(&result) => result.push_str(&sep),
BraceStyle::AlwaysNextLine => result.push_str(&sep),
BraceStyle::PreferSameLine => result.push(' '),
BraceStyle::SameLineWhere => if !where_clause_str.is_empty() {
result.push('\n');
result.push_str(&offset.to_string(context.config));
result.push_str(&sep);
} else {
result.push(' ');
},
@ -610,8 +626,7 @@ pub fn format_impl(
}
if result.chars().last().unwrap() == '{' {
result.push('\n');
result.push_str(&offset.to_string(context.config));
result.push_str(&sep);
}
result.push('}');
@ -632,7 +647,7 @@ fn is_impl_single_line(
let open_pos = try_opt!(snippet.find_uncommented("{")) + 1;
Some(
context.config.impl_empty_single_line() && items.is_empty() &&
context.config.impl_empty_single_line() && items.is_empty() && !result.contains('\n') &&
result.len() + where_clause_str.len() <= context.config.max_width() &&
!contains_comment(&snippet[open_pos..]),
)