clang-format: Improve heuristic around avoiding bad line breaks.

Now, this can be properly formatted:
  static_cast<A< //
      B> *>(     //
      );

Before, clang-format could end up, not formatting the code at all.

llvm-svn: 213055
This commit is contained in:
Daniel Jasper 2014-07-15 09:00:34 +00:00
parent bce3cf8074
commit fcfac10c8a
2 changed files with 10 additions and 1 deletions

View File

@ -108,7 +108,8 @@ bool ContinuationIndenter::canBreak(const LineState &State) {
// ... // ...
// As they hide "DoSomething" and are generally bad for readability. // As they hide "DoSomething" and are generally bad for readability.
if (Previous.opensScope() && Previous.isNot(tok::l_brace) && if (Previous.opensScope() && Previous.isNot(tok::l_brace) &&
State.LowestLevelOnLine < State.StartOfLineLevel) State.LowestLevelOnLine < State.StartOfLineLevel &&
State.LowestLevelOnLine < Current.NestingLevel)
return false; return false;
if (Current.isMemberAccess() && State.Stack.back().ContainsUnwrappedBuilder) if (Current.isMemberAccess() && State.Stack.back().ContainsUnwrappedBuilder)
return false; return false;

View File

@ -4467,6 +4467,14 @@ TEST_F(FormatTest, WrapsTemplateDeclarations) {
" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
" bbbbbbbbbbbbbbbbbbbbbbbb);", " bbbbbbbbbbbbbbbbbbbbbbbb);",
getLLVMStyleWithColumns(72)); getLLVMStyleWithColumns(72));
EXPECT_EQ("static_cast<A< //\n"
" B> *>(\n"
"\n"
" );",
format("static_cast<A<//\n"
" B>*>(\n"
"\n"
" );"));
FormatStyle AlwaysBreak = getLLVMStyle(); FormatStyle AlwaysBreak = getLLVMStyle();
AlwaysBreak.AlwaysBreakTemplateDeclarations = true; AlwaysBreak.AlwaysBreakTemplateDeclarations = true;