From e5777d25d693a90442d1fe41cece50861d925ee5 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Thu, 23 May 2013 10:15:45 +0000 Subject: [PATCH] Improve formatting of braced lists. Before: vector x { 1, 2, 3 }; After: vector x{ 1, 2, 3 }; Also add a style option to remove the spaces inside braced lists, so that the above becomes: std::vector v{1, 2, 3}; llvm-svn: 182570 --- clang/include/clang/Format/Format.h | 10 ++++-- clang/lib/Format/Format.cpp | 4 +++ clang/lib/Format/TokenAnnotator.cpp | 5 +++ clang/unittests/Format/FormatTest.cpp | 45 ++++++++++++++++++--------- 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index 1bc1996d2031..d644fbdfd14e 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -118,6 +118,9 @@ struct FormatStyle { /// \brief The brace breaking style to use. BraceBreakingStyle BreakBeforeBraces; + /// \brief If \c true, format { 1 }, otherwise {1}. + bool SpacesInBracedLists; + bool operator==(const FormatStyle &R) const { return AccessModifierOffset == R.AccessModifierOffset && AlignEscapedNewlinesLeft == R.AlignEscapedNewlinesLeft && @@ -126,21 +129,22 @@ struct FormatStyle { AllowShortIfStatementsOnASingleLine == R.AllowShortIfStatementsOnASingleLine && BinPackParameters == R.BinPackParameters && + BreakBeforeBraces == R.BreakBeforeBraces && ColumnLimit == R.ColumnLimit && ConstructorInitializerAllOnOneLineOrOnePerLine == R.ConstructorInitializerAllOnOneLineOrOnePerLine && DerivePointerBinding == R.DerivePointerBinding && IndentCaseLabels == R.IndentCaseLabels && + IndentWidth == R.IndentWidth && MaxEmptyLinesToKeep == R.MaxEmptyLinesToKeep && ObjCSpaceBeforeProtocolList == R.ObjCSpaceBeforeProtocolList && PenaltyExcessCharacter == R.PenaltyExcessCharacter && PenaltyReturnTypeOnItsOwnLine == R.PenaltyReturnTypeOnItsOwnLine && PointerBindsToType == R.PointerBindsToType && SpacesBeforeTrailingComments == R.SpacesBeforeTrailingComments && + SpacesInBracedLists == R.SpacesInBracedLists && Standard == R.Standard && - IndentWidth == R.IndentWidth && - UseTab == R.UseTab && - BreakBeforeBraces == R.BreakBeforeBraces; + UseTab == R.UseTab; } }; diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 6e81e44fe033..e19583376a5e 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -100,6 +100,8 @@ template <> struct MappingTraits { IO.mapOptional("PointerBindsToType", Style.PointerBindsToType); IO.mapOptional("SpacesBeforeTrailingComments", Style.SpacesBeforeTrailingComments); + IO.mapOptional("SpacesInBracedLists", + Style.SpacesInBracedLists); IO.mapOptional("Standard", Style.Standard); IO.mapOptional("IndentWidth", Style.IndentWidth); IO.mapOptional("UseTab", Style.UseTab); @@ -130,6 +132,7 @@ FormatStyle getLLVMStyle() { LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 75; LLVMStyle.PointerBindsToType = false; LLVMStyle.SpacesBeforeTrailingComments = 1; + LLVMStyle.SpacesInBracedLists = true; LLVMStyle.Standard = FormatStyle::LS_Cpp03; LLVMStyle.IndentWidth = 2; LLVMStyle.UseTab = false; @@ -155,6 +158,7 @@ FormatStyle getGoogleStyle() { GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 200; GoogleStyle.PointerBindsToType = true; GoogleStyle.SpacesBeforeTrailingComments = 2; + GoogleStyle.SpacesInBracedLists = false; GoogleStyle.Standard = FormatStyle::LS_Auto; GoogleStyle.IndentWidth = 2; GoogleStyle.UseTab = false; diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index c914d4beab25..3f3374435c17 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -1089,6 +1089,11 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, Right.FormatTok.Tok.getObjCKeywordID() != tok::objc_not_keyword) return false; if (Left.is(tok::l_brace) && Right.is(tok::r_brace)) + return false; // No spaces in "{}". + if (Left.is(tok::l_brace) || Right.is(tok::r_brace)) + return Style.SpacesInBracedLists; + if (Left.is(tok::identifier) && Right.is(tok::l_brace) && + Right.getNextNoneComment()) return false; if (Right.is(tok::ellipsis)) return false; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index c15e0622b46c..2d8a1b29cf8c 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -947,11 +947,11 @@ TEST_F(FormatTest, CommentsInStaticInitializers) { " // comment for bb....\n" " bbbbbbbbbbb, ccccccccccc };"); verifyGoogleFormat( - "static SomeType type = { aaaaaaaaaaa, // comment for aa...\n" - " bbbbbbbbbbb, ccccccccccc };"); - verifyGoogleFormat("static SomeType type = { aaaaaaaaaaa,\n" - " // comment for bb....\n" - " bbbbbbbbbbb, ccccccccccc };"); + "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n" + " bbbbbbbbbbb, ccccccccccc};"); + verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n" + " // comment for bb....\n" + " bbbbbbbbbbb, ccccccccccc};"); verifyFormat("S s = { { a, b, c }, // Group #1\n" " { d, e, f }, // Group #2\n" @@ -1189,9 +1189,9 @@ TEST_F(FormatTest, StaticInitializers) { // Allow bin-packing in static initializers as this would often lead to // terrible results, e.g.: verifyGoogleFormat( - "static SomeClass = { a, b, c, d, e, f, g, h, i, j,\n" - " looooooooooooooooooooooooooooooooooongname,\n" - " looooooooooooooooooooooooooooooong };"); + "static SomeClass = {a, b, c, d, e, f, g, h, i, j,\n" + " looooooooooooooooooooooooooooooooooongname,\n" + " looooooooooooooooooooooooooooooong};"); // Here, everything other than the "}" would fit on a line. verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" " 100000000000000000000000\n" @@ -1216,10 +1216,10 @@ TEST_F(FormatTest, NestedStaticInitializers) { " { kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL },\n" " { kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL }\n" "};"); - verifyGoogleFormat("somes Status::global_reps[3] = {\n" - " { kGlobalRef, OK_CODE, NULL, NULL, NULL },\n" - " { kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL },\n" - " { kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL }\n" + verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" + " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" + " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" + " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}\n" "};"); verifyFormat( "CGRect cg_rect = { { rect.fLeft, rect.fTop },\n" @@ -1238,6 +1238,12 @@ TEST_F(FormatTest, NestedStaticInitializers) { " 222222222222222222222222222222,\n" " 333333333333333333333333333333 } },\n" " { { 1, 2, 3 } }, { { 1, 2, 3 } } };"); + verifyGoogleFormat( + "SomeArrayOfSomeType a = {{{1, 2, 3}}, {{1, 2, 3}},\n" + " {{111111111111111111111111111111,\n" + " 222222222222222222222222222222,\n" + " 333333333333333333333333333333}},\n" + " {{1, 2, 3}}, {{1, 2, 3}}};"); // FIXME: We might at some point want to handle this similar to parameter // lists, where we have an option to put each on a single line. @@ -3101,11 +3107,19 @@ TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { } TEST_F(FormatTest, LayoutCxx11ConstructorBraceInitializers) { - verifyFormat("vector x { 1, 2, 3, 4 };"); - verifyFormat("vector x { {}, {}, {}, {} };"); + verifyFormat("vector x{ 1, 2, 3, 4 };"); + verifyFormat("vector x{ {}, {}, {}, {} };"); verifyFormat("f({ 1, 2 });"); - verifyFormat("auto v = Foo { 1 };"); + verifyFormat("auto v = Foo{ 1 };"); verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });"); + + FormatStyle NoSpaces = getLLVMStyle(); + NoSpaces.SpacesInBracedLists = false; + verifyFormat("vector x{1, 2, 3, 4};", NoSpaces); + verifyFormat("vector x{{}, {}, {}, {}};", NoSpaces); + verifyFormat("f({1, 2});", NoSpaces); + verifyFormat("auto v = Foo{1};", NoSpaces); + verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});", NoSpaces); } TEST_F(FormatTest, LayoutTokensFollowingBlockInParentheses) { @@ -4312,6 +4326,7 @@ TEST_F(FormatTest, ParsesConfiguration) { CHECK_PARSE_BOOL(IndentCaseLabels); CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); CHECK_PARSE_BOOL(PointerBindsToType); + CHECK_PARSE_BOOL(SpacesInBracedLists); CHECK_PARSE_BOOL(UseTab); CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);