clang-format: Let a trailing comma in braced lists enforce linebreaks.

Before:
  vector<int> x{1, 2, 3, 4, };

After:
  vector<int> x{
      1, 2, 3, 4,
  };

This fixes llvm.org/PR18519.

llvm-svn: 204458
This commit is contained in:
Daniel Jasper 2014-03-21 12:38:57 +00:00
parent 28df0a356e
commit a125d53a7b
2 changed files with 18 additions and 4 deletions

View File

@ -1478,6 +1478,7 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
const FormatToken &Right) {
const FormatToken &Left = *Right.Previous;
if (Right.is(tok::comment)) {
return Right.Previous->BlockKind != BK_BracedInit &&
Right.Previous->Type != TT_CtorInitializerColon &&
@ -1514,6 +1515,13 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
Style.Language == FormatStyle::LK_Proto) {
// Don't enums onto single lines in protocol buffers.
return true;
} else if ((Left.is(tok::l_brace) && Left.MatchingParen &&
Left.MatchingParen->Previous &&
Left.MatchingParen->Previous->is(tok::comma)) ||
(Right.is(tok::r_brace) && Left.is(tok::comma))) {
// If the last token before a '}' is a comma, the intention is to insert a
// line break after it in order to make shuffling around entries easier.
return true;
}
return false;
}

View File

@ -4901,6 +4901,9 @@ TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
TEST_F(FormatTest, LayoutCxx11ConstructorBraceInitializers) {
verifyFormat("vector<int> x{1, 2, 3, 4};");
verifyFormat("vector<int> x{\n"
" 1, 2, 3, 4,\n"
"};");
verifyFormat("vector<T> x{{}, {}, {}, {}};");
verifyFormat("f({1, 2});");
verifyFormat("auto v = Foo{-1};");
@ -5036,8 +5039,9 @@ TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
getLLVMStyleWithColumns(43));
// Trailing commas.
verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
" 1, 1, 1, 1, };",
verifyFormat("vector<int> x = {\n"
" 1, 1, 1, 1, 1, 1, 1, 1,\n"
"};",
getLLVMStyleWithColumns(39));
verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
" 1, 1, 1, 1, //\n"
@ -6028,10 +6032,12 @@ TEST_F(FormatTest, ObjCDictLiterals) {
verifyFormat("@{}");
verifyFormat("@{@\"one\" : @1}");
verifyFormat("return @{@\"one\" : @1;");
verifyFormat("@{@\"one\" : @1, }");
verifyFormat("@{@\"one\" : @1}");
verifyFormat("@{@\"one\" : @{@2 : @1}}");
verifyFormat("@{@\"one\" : @{@2 : @1}, }");
verifyFormat("@{\n"
" @\"one\" : @{@2 : @1},\n"
"}");
verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
verifyFormat("[self setDict:@{}");