Block format control flow discriminant expressions and binops
Fixes #1450 Adds control_style option
This commit is contained in:
parent
21cbb8d6e4
commit
75a13868da
@ -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"
|
||||||
|
@ -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";
|
||||||
|
24
src/expr.rs
24
src/expr.rs
@ -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() {
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user