Fix bug where optimization would lead to strange line breaks.

Before:
  void f() {
    CHECK_EQ(aaaa, (
                       *bbbbbbbbb)->cccccc)
        << "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";
  }

After:
  void f() {
    CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)
        << "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";
  }

llvm-svn: 195240
This commit is contained in:
Manuel Klimek 2013-11-20 11:20:32 +00:00
parent 55758e9691
commit 06c84f2e07
3 changed files with 23 additions and 8 deletions

View File

@ -224,13 +224,14 @@ unsigned ContinuationIndenter::addTokenToState(LineState &State, bool Newline,
if (Newline)
Penalty = addTokenOnNewLine(State, DryRun);
else
addTokenOnCurrentLine(State, DryRun, ExtraSpaces);
Penalty = addTokenOnCurrentLine(State, DryRun, ExtraSpaces);
return moveStateToNextToken(State, DryRun, Newline) + Penalty;
}
void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
unsigned ExtraSpaces) {
unsigned ContinuationIndenter::addTokenOnCurrentLine(LineState &State,
bool DryRun,
unsigned ExtraSpaces) {
FormatToken &Current = *State.NextToken;
const FormatToken &Previous = *State.NextToken->Previous;
if (Current.is(tok::equal) &&
@ -249,6 +250,15 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
State.Stack.back().LastSpace = State.Stack.back().VariablePos;
}
unsigned Penalty = 0;
// A break before a "<<" will get Style.PenaltyBreakFirstLessLess, so a
// continuation with "<<" has a smaller penalty in general.
// If the LHS is long, we don't want to penalize the break though, so we
// also add Style.PenaltyBreakFirstLessLess.
if (Current.is(tok::lessless) && State.Stack.back().FirstLessLess == 0 &&
State.Column > Style.ColumnLimit / 2)
Penalty += Style.PenaltyBreakFirstLessLess;
unsigned Spaces = Current.SpacesRequiredBefore + ExtraSpaces;
if (!DryRun)
@ -307,6 +317,7 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
State.Stack[State.Stack.size() - 2].CallContinuation == 0)
State.Stack.back().LastSpace = State.Column;
}
return Penalty;
}
unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
@ -332,9 +343,8 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
Penalty += State.NextToken->SplitPenalty;
// Breaking before the first "<<" is generally not desirable if the LHS is
// short.
if (Current.is(tok::lessless) && State.Stack.back().FirstLessLess == 0 &&
State.Column <= Style.ColumnLimit / 2)
// short (not breaking with a long LHS is penalized in addTokenOnCurrentLine).
if (Current.is(tok::lessless) && State.Stack.back().FirstLessLess == 0)
Penalty += Style.PenaltyBreakFirstLessLess;
if (Current.is(tok::l_brace) && Current.BlockKind == BK_Block) {

View File

@ -91,8 +91,8 @@ private:
///
/// If \p DryRun is \c false, also creates and stores the required
/// \c Replacement.
void addTokenOnCurrentLine(LineState &State, bool DryRun,
unsigned ExtraSpaces);
unsigned addTokenOnCurrentLine(LineState &State, bool DryRun,
unsigned ExtraSpaces);
/// \brief Appends the next token to \p State and updates information
/// necessary for indentation.

View File

@ -3744,6 +3744,11 @@ TEST_F(FormatTest, AlignsPipes) {
EXPECT_EQ("llvm::errs() << \"\n"
" << a;",
format("llvm::errs() << \"\n<<a;"));
verifyFormat("void f() {\n"
" CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
" << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
"}");
}
TEST_F(FormatTest, UnderstandsEquals) {