Update rewrite_trait_ref to return Option<String>

This commit is contained in:
topecongiro 2017-06-12 08:53:19 +09:00
parent e94fcfcd39
commit 62e9473d07

View file

@ -676,25 +676,26 @@ fn format_impl_ref_and_type(context: &RewriteContext,
}; };
if let Some(ref trait_ref) = *trait_ref { if let Some(ref trait_ref) = *trait_ref {
let success = format_trait_ref_then_update_result(context, let result_len = result.len();
&trait_ref, if let Some(trait_ref_str) =
offset, rewrite_trait_ref(context,
&generics_str, &trait_ref,
true, offset,
polarity_str, &generics_str,
&mut result); true,
if !success { polarity_str,
result_len) {
result.push_str(&trait_ref_str);
} else {
let generics_str = let generics_str =
try_opt!(rewrite_generics_inner(context, generics, shape, 0, mk_sp(lo, hi))); try_opt!(rewrite_generics_inner(context, generics, shape, 0, mk_sp(lo, hi)));
if !format_trait_ref_then_update_result(context, result.push_str(&try_opt!(rewrite_trait_ref(context,
&trait_ref, &trait_ref,
offset, offset,
&generics_str, &generics_str,
false, false,
polarity_str, polarity_str,
&mut result) { result_len)));
return None;
}
} }
} else { } else {
result.push_str(&generics_str); result.push_str(&generics_str);
@ -752,43 +753,40 @@ fn format_impl_ref_and_type(context: &RewriteContext,
} }
} }
// Returns false if failed to update result: then, try using multiline. fn rewrite_trait_ref(context: &RewriteContext,
fn format_trait_ref_then_update_result(context: &RewriteContext, trait_ref: &ast::TraitRef,
trait_ref: &ast::TraitRef, offset: Indent,
offset: Indent, generics_str: &str,
generics_str: &str, retry: bool,
retry: bool, polarity_str: &str,
polarity_str: &str, result_len: usize)
result: &mut String) -> Option<String> {
-> bool {
// 1 = space between generics and trait_ref // 1 = space between generics and trait_ref
let used_space = 1 + polarity_str.len() + let used_space = 1 + polarity_str.len() +
if generics_str.contains('\n') { if generics_str.contains('\n') {
last_line_width(&generics_str) last_line_width(&generics_str)
} else { } else {
result.len() + generics_str.len() result_len + generics_str.len()
}; };
let shape = Shape::indented(offset + used_space, context.config); let shape = Shape::indented(offset + used_space, context.config);
if let Some(trait_ref_str) = trait_ref.rewrite(context, shape) { if let Some(trait_ref_str) = trait_ref.rewrite(context, shape) {
if !(retry && trait_ref_str.contains('\n')) { if !(retry && trait_ref_str.contains('\n')) {
result.push_str(&format!("{} {}{}", generics_str, polarity_str, &trait_ref_str)); return Some(format!("{} {}{}", generics_str, polarity_str, &trait_ref_str));
return true;
} }
} }
// We could not make enough space for trait_ref, so put it on new line. // We could not make enough space for trait_ref, so put it on new line.
if !retry { if !retry {
let offset = offset.block_indent(context.config); let offset = offset.block_indent(context.config);
let shape = Shape::indented(offset, context.config); let shape = Shape::indented(offset, context.config);
if let Some(trait_ref_str) = trait_ref.rewrite(context, shape) { let trait_ref_str = try_opt!(trait_ref.rewrite(context, shape));
result.push_str(&format!("{}\n{}{}{}", Some(format!("{}\n{}{}{}",
generics_str, generics_str,
&offset.to_string(context.config), &offset.to_string(context.config),
polarity_str, polarity_str,
&trait_ref_str)); &trait_ref_str))
return true; } else {
} None
} }
false
} }
pub fn format_struct(context: &RewriteContext, pub fn format_struct(context: &RewriteContext,