Improve formatting of braced lists.
Before: vector<int> x { 1, 2, 3 }; After: vector<int> x{ 1, 2, 3 }; Also add a style option to remove the spaces inside braced lists, so that the above becomes: std::vector<int> v{1, 2, 3}; llvm-svn: 182570
This commit is contained in:
parent
6734592c12
commit
e5777d25d6
|
@ -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;
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -100,6 +100,8 @@ template <> struct MappingTraits<clang::format::FormatStyle> {
|
|||
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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<int> x { 1, 2, 3, 4 };");
|
||||
verifyFormat("vector<T> x { {}, {}, {}, {} };");
|
||||
verifyFormat("vector<int> x{ 1, 2, 3, 4 };");
|
||||
verifyFormat("vector<T> 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<int> x{1, 2, 3, 4};", NoSpaces);
|
||||
verifyFormat("vector<T> 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);
|
||||
|
|
Loading…
Reference in New Issue