Block format control flow discriminant expressions and binops

Fixes #1450

Adds control_style option
This commit is contained in:
Nick Cameron 2017-05-05 14:29:18 +12:00
parent 21cbb8d6e4
commit 75a13868da
6 changed files with 75 additions and 7 deletions

View File

@ -1,5 +1,6 @@
fn_args_layout = "Block" fn_args_layout = "Block"
array_layout = "Block" array_layout = "Block"
control_style = "Rfc"
where_style = "Rfc" where_style = "Rfc"
generics_indent = "Block" generics_indent = "Block"
fn_call_style = "Block" fn_call_style = "Block"

View File

@ -338,6 +338,7 @@ fn default() -> Config {
newline_style: NewlineStyle, NewlineStyle::Unix, "Unix or Windows line endings"; newline_style: NewlineStyle, NewlineStyle::Unix, "Unix or Windows line endings";
fn_brace_style: BraceStyle, BraceStyle::SameLineWhere, "Brace style for functions"; fn_brace_style: BraceStyle, BraceStyle::SameLineWhere, "Brace style for functions";
item_brace_style: BraceStyle, BraceStyle::SameLineWhere, "Brace style for structs and enums"; item_brace_style: BraceStyle, BraceStyle::SameLineWhere, "Brace style for structs and enums";
control_style: Style, Style::Default, "Indent style for control flow statements";
control_brace_style: ControlBraceStyle, ControlBraceStyle::AlwaysSameLine, control_brace_style: ControlBraceStyle, ControlBraceStyle::AlwaysSameLine,
"Brace style for control flow constructs"; "Brace style for control flow constructs";
impl_empty_single_line: bool, true, "Put empty-body implementations on a single line"; impl_empty_single_line: bool, true, "Put empty-body implementations on a single line";

View File

@ -26,7 +26,7 @@
semicolon_for_stmt, trimmed_last_line_width, left_most_sub_expr, stmt_expr, semicolon_for_stmt, trimmed_last_line_width, left_most_sub_expr, stmt_expr,
colon_spaces}; colon_spaces};
use visitor::FmtVisitor; use visitor::FmtVisitor;
use config::{Config, IndentStyle, MultilineStyle, ControlBraceStyle}; use config::{Config, IndentStyle, MultilineStyle, ControlBraceStyle, Style};
use comment::{FindUncommented, rewrite_comment, contains_comment, recover_comment_removed}; use comment::{FindUncommented, rewrite_comment, contains_comment, recover_comment_removed};
use types::{rewrite_path, PathContext}; use types::{rewrite_path, PathContext};
use items::{span_lo_for_arg, span_hi_for_arg}; use items::{span_lo_for_arg, span_hi_for_arg};
@ -314,8 +314,12 @@ pub fn rewrite_pair<LHS, RHS>(lhs: &LHS,
.max_width .max_width
.checked_sub(shape.used_width() + prefix.len() + .checked_sub(shape.used_width() + prefix.len() +
infix.len())); infix.len()));
let rhs_shape = try_opt!(shape.sub_width(suffix.len() + prefix.len())) let rhs_shape = match context.config.control_style {
.visual_indent(prefix.len()); Style::Default => {
try_opt!(shape.sub_width(suffix.len() + prefix.len())).visual_indent(prefix.len())
}
Style::Rfc => try_opt!(shape.block_left(context.config.tab_spaces)),
};
let rhs_result = try_opt!(rhs.rewrite(context, rhs_shape)); let rhs_result = try_opt!(rhs.rewrite(context, rhs_shape));
let lhs_result = try_opt!(lhs.rewrite(context, let lhs_result = try_opt!(lhs.rewrite(context,
@ -884,7 +888,10 @@ fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option<String> {
let pat_expr_string = match self.cond { let pat_expr_string = match self.cond {
Some(cond) => { Some(cond) => {
let mut cond_shape = try_opt!(constr_shape.shrink_left(add_offset)); let mut cond_shape = match context.config.control_style {
Style::Default => try_opt!(constr_shape.shrink_left(add_offset)),
Style::Rfc => constr_shape,
};
if context.config.control_brace_style != ControlBraceStyle::AlwaysNextLine { if context.config.control_brace_style != ControlBraceStyle::AlwaysNextLine {
// 2 = " {".len() // 2 = " {".len()
cond_shape = try_opt!(cond_shape.sub_width(2)); cond_shape = try_opt!(cond_shape.sub_width(2));
@ -900,6 +907,9 @@ fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option<String> {
None => String::new(), None => String::new(),
}; };
let force_newline_brace = context.config.control_style == Style::Rfc &&
pat_expr_string.contains('\n');
// Try to format if-else on single line. // Try to format if-else on single line.
if self.allow_single_line && context.config.single_line_if_else_max_width > 0 { if self.allow_single_line && context.config.single_line_if_else_max_width > 0 {
let trial = self.rewrite_single_line(&pat_expr_string, context, shape.width); let trial = self.rewrite_single_line(&pat_expr_string, context, shape.width);
@ -957,8 +967,8 @@ fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option<String> {
&shape.indent.block_only().to_string(context.config); &shape.indent.block_only().to_string(context.config);
let block_sep = if self.cond.is_none() && between_kwd_cond_comment.is_some() { let block_sep = if self.cond.is_none() && between_kwd_cond_comment.is_some() {
"" ""
} else if context.config.control_brace_style == } else if context.config.control_brace_style == ControlBraceStyle::AlwaysNextLine ||
ControlBraceStyle::AlwaysNextLine { force_newline_brace {
alt_block_sep.as_str() alt_block_sep.as_str()
} else { } else {
" " " "
@ -1494,7 +1504,7 @@ fn rewrite_pat_expr(context: &RewriteContext,
connector: &str, connector: &str,
shape: Shape) shape: Shape)
-> Option<String> { -> Option<String> {
debug!("rewrite_pat_expr {:?} {:?}", shape, pat); debug!("rewrite_pat_expr {:?} {:?} {:?}", shape, pat, expr);
let mut result = match pat { let mut result = match pat {
Some(pat) => { Some(pat) => {
let matcher = if matcher.is_empty() { let matcher = if matcher.is_empty() {

View File

@ -287,6 +287,14 @@ pub fn block_indent(&self, extra_width: usize) -> Shape {
} }
} }
pub fn block_left(&self, width: usize) -> Option<Shape> {
let block_shape = self.block_indent(width);
Some(Shape {
width: try_opt!(block_shape.width.checked_sub(width)),
..block_shape
})
}
pub fn add_offset(&self, extra_width: usize) -> Shape { pub fn add_offset(&self, extra_width: usize) -> Shape {
Shape { Shape {
width: self.width, width: self.width,

View File

@ -1,5 +1,6 @@
// rustfmt-array_layout: Block // rustfmt-array_layout: Block
// rustfmt-fn_call_style: Block // rustfmt-fn_call_style: Block
// rustfmt-control_style: Rfc
// Test expressions with block formatting. // Test expressions with block formatting.
fn arrays() { fn arrays() {
@ -120,3 +121,25 @@ fn macros() {
Some(p) => baz!(one_item_macro_as_expression_which_is_also_loooooooooooooooong), Some(p) => baz!(one_item_macro_as_expression_which_is_also_loooooooooooooooong),
}; };
} }
fn issue_1450() {
if selfstate
.compare_exchandsfasdsdfgsdgsdfgsdfgsdfgsdfgsdfgfsfdsage_weak(
STATE_PARKED,
STATE_UNPARKED,
Release,
Relaxed,
Release,
Relaxed,
)
.is_ok() {
return;
}
}
fn foo() {
if real_total <= limit && !pre_line_comments &&
!items.into_iter().any(|item| item.as_ref().is_multiline()) {
DefinitiveListTactic::Horizontal
}
}

View File

@ -1,5 +1,6 @@
// rustfmt-array_layout: Block // rustfmt-array_layout: Block
// rustfmt-fn_call_style: Block // rustfmt-fn_call_style: Block
// rustfmt-control_style: Rfc
// Test expressions with block formatting. // Test expressions with block formatting.
fn arrays() { fn arrays() {
@ -188,3 +189,27 @@ fn macros() {
Some(p) => baz!(one_item_macro_as_expression_which_is_also_loooooooooooooooong), Some(p) => baz!(one_item_macro_as_expression_which_is_also_loooooooooooooooong),
}; };
} }
fn issue_1450() {
if selfstate
.compare_exchandsfasdsdfgsdgsdfgsdfgsdfgsdfgsdfgfsfdsage_weak(
STATE_PARKED,
STATE_UNPARKED,
Release,
Relaxed,
Release,
Relaxed,
)
.is_ok()
{
return;
}
}
fn foo() {
if real_total <= limit && !pre_line_comments &&
!items.into_iter().any(|item| item.as_ref().is_multiline())
{
DefinitiveListTactic::Horizontal
}
}