clang-format: Prefer an additional line-break over hanging indent.

Don't allow the RHS of an operator to be split over multiple
lines unless there is a line-break right after the operator.

Before:
  if (aaaa && bbbbb || // break
                  cccc) {
  }

After:
  if (aaaa &&
      bbbbb || // break
          cccc) {
  }

In most cases, this seems to increase readability.

llvm-svn: 205527
This commit is contained in:
Daniel Jasper 2014-04-03 12:00:33 +00:00
parent 2b7556ec16
commit 5c33265c9e
2 changed files with 15 additions and 2 deletions

View File

@ -609,6 +609,18 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
std::max(std::max(State.Column, NewParenState.Indent), std::max(std::max(State.Column, NewParenState.Indent),
State.Stack.back().LastSpace); State.Stack.back().LastSpace);
// Don't allow the RHS of an operator to be split over multiple lines unless
// there is a line-break right after the operator.
// Exclude relational operators, as there, it is always more desirable to
// have the LHS 'left' of the RHS.
// FIXME: Implement this for '<<' and BreakBeforeBinaryOperators.
if (!Newline && Previous && Previous->Type == TT_BinaryOperator &&
!Previous->isOneOf(tok::lessless, tok::question, tok::colon) &&
Previous->getPrecedence() > prec::Assignment &&
Previous->getPrecedence() != prec::Relational &&
!Style.BreakBeforeBinaryOperators)
NewParenState.NoLineBreak = true;
// Do not indent relative to the fake parentheses inserted for "." or "->". // Do not indent relative to the fake parentheses inserted for "." or "->".
// This is a special case to make the following to statements consistent: // This is a special case to make the following to statements consistent:
// OuterFunction(InnerFunctionCall( // break // OuterFunction(InnerFunctionCall( // break

View File

@ -2889,8 +2889,9 @@ TEST_F(FormatTest, ExpressionIndentation) {
" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
verifyFormat("if () {\n" verifyFormat("if () {\n"
"} else if (aaaaa && bbbbb > // break\n" "} else if (aaaaa &&\n"
" ccccc) {\n" " bbbbb > // break\n"
" ccccc) {\n"
"}"); "}");
// Presence of a trailing comment used to change indentation of b. // Presence of a trailing comment used to change indentation of b.