summaryrefslogtreecommitdiffstats
path: root/clang/lib/Format/ContinuationIndenter.cpp
diff options
context:
space:
mode:
authorManuel Klimek <klimek@google.com>2013-11-20 11:20:32 +0000
committerManuel Klimek <klimek@google.com>2013-11-20 11:20:32 +0000
commit06c84f2e071203e6a2acaa3ff0c1c30d63c9c063 (patch)
treed540796c0889382711d35b9ad48075c1fe84b7a6 /clang/lib/Format/ContinuationIndenter.cpp
parent55758e9691410b9b3bee24f37e0255e93628e46c (diff)
downloadbcm5719-llvm-06c84f2e071203e6a2acaa3ff0c1c30d63c9c063.tar.gz
bcm5719-llvm-06c84f2e071203e6a2acaa3ff0c1c30d63c9c063.zip
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
Diffstat (limited to 'clang/lib/Format/ContinuationIndenter.cpp')
-rw-r--r--clang/lib/Format/ContinuationIndenter.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 971acc2b7a3..bbc1ac53824 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -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) {
OpenPOWER on IntegriCloud