diff --git a/rfc-rustfmt.toml b/rfc-rustfmt.toml index 914d19d6cb2..0e622bdd943 100644 --- a/rfc-rustfmt.toml +++ b/rfc-rustfmt.toml @@ -1,5 +1,6 @@ fn_args_layout = "Block" array_layout = "Block" +control_style = "Rfc" where_style = "Rfc" generics_indent = "Block" fn_call_style = "Block" diff --git a/src/config.rs b/src/config.rs index f0f2d529308..805581abb4e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -338,6 +338,7 @@ fn default() -> Config { newline_style: NewlineStyle, NewlineStyle::Unix, "Unix or Windows line endings"; fn_brace_style: BraceStyle, BraceStyle::SameLineWhere, "Brace style for functions"; 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, "Brace style for control flow constructs"; impl_empty_single_line: bool, true, "Put empty-body implementations on a single line"; diff --git a/src/expr.rs b/src/expr.rs index 5876409a9fa..bb4caaa7b93 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -26,7 +26,7 @@ semicolon_for_stmt, trimmed_last_line_width, left_most_sub_expr, stmt_expr, colon_spaces}; 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 types::{rewrite_path, PathContext}; use items::{span_lo_for_arg, span_hi_for_arg}; @@ -314,8 +314,12 @@ pub fn rewrite_pair(lhs: &LHS, .max_width .checked_sub(shape.used_width() + prefix.len() + infix.len())); - let rhs_shape = try_opt!(shape.sub_width(suffix.len() + prefix.len())) - .visual_indent(prefix.len()); + let rhs_shape = match context.config.control_style { + 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 lhs_result = try_opt!(lhs.rewrite(context, @@ -884,7 +888,10 @@ fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option { let pat_expr_string = match self.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 { // 2 = " {".len() cond_shape = try_opt!(cond_shape.sub_width(2)); @@ -900,6 +907,9 @@ fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option { 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. 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); @@ -957,8 +967,8 @@ fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option { &shape.indent.block_only().to_string(context.config); let block_sep = if self.cond.is_none() && between_kwd_cond_comment.is_some() { "" - } else if context.config.control_brace_style == - ControlBraceStyle::AlwaysNextLine { + } else if context.config.control_brace_style == ControlBraceStyle::AlwaysNextLine || + force_newline_brace { alt_block_sep.as_str() } else { " " @@ -1494,7 +1504,7 @@ fn rewrite_pat_expr(context: &RewriteContext, connector: &str, shape: Shape) -> Option { - debug!("rewrite_pat_expr {:?} {:?}", shape, pat); + debug!("rewrite_pat_expr {:?} {:?} {:?}", shape, pat, expr); let mut result = match pat { Some(pat) => { let matcher = if matcher.is_empty() { diff --git a/src/lib.rs b/src/lib.rs index 6935f0f7acd..a3f1a93ca48 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -287,6 +287,14 @@ pub fn block_indent(&self, extra_width: usize) -> Shape { } } + pub fn block_left(&self, width: usize) -> Option { + 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 { Shape { width: self.width, diff --git a/tests/source/expr-block.rs b/tests/source/expr-block.rs index d7f7c610eb3..ad959f8ee01 100644 --- a/tests/source/expr-block.rs +++ b/tests/source/expr-block.rs @@ -1,5 +1,6 @@ // rustfmt-array_layout: Block // rustfmt-fn_call_style: Block +// rustfmt-control_style: Rfc // Test expressions with block formatting. fn arrays() { @@ -120,3 +121,25 @@ fn macros() { 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 + } +} diff --git a/tests/target/expr-block.rs b/tests/target/expr-block.rs index f7a157cf3df..349f2a00c84 100644 --- a/tests/target/expr-block.rs +++ b/tests/target/expr-block.rs @@ -1,5 +1,6 @@ // rustfmt-array_layout: Block // rustfmt-fn_call_style: Block +// rustfmt-control_style: Rfc // Test expressions with block formatting. fn arrays() { @@ -188,3 +189,27 @@ fn macros() { 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 + } +}