forked from OSchip/llvm-project
clang-format: Do not binpack initialization lists
Summary: This patch tries to avoid binpacking when initializing lists/arrays, to allow things like: static int types[] = { registerType1(), registerType2(), registerType3(), }; std::map<int, std::string> x = { { 0, "foo fjakfjaklf kljj" }, { 1, "bar fjakfjaklf kljj" }, { 2, "stuff fjakfjaklf kljj" }, }; This is similar to how dictionnaries are formatted, and actually corresponds to the same conditions: when initializing a container (and not just 'calling' a constructor). Such formatting involves 2 things: * Line breaks around the content of the block. This can be forced by adding a comma or comment after the last element * Elements should not be binpacked This patch considers the block is an initializer list if it either ends with a comma, or follows an assignment, which seems to provide a sensible approximation. Reviewers: krasimir, djasper Reviewed By: djasper Subscribers: malcolm.parsons, klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D34238 llvm-svn: 306868
This commit is contained in:
parent
5372f0a73e
commit
d2130f51a1
|
@ -1063,12 +1063,12 @@ void ContinuationIndenter::moveStatePastScopeOpener(LineState &State,
|
||||||
Current.MatchingParen->Previous &&
|
Current.MatchingParen->Previous &&
|
||||||
Current.MatchingParen->Previous->is(tok::comma);
|
Current.MatchingParen->Previous->is(tok::comma);
|
||||||
AvoidBinPacking =
|
AvoidBinPacking =
|
||||||
(Current.is(TT_ArrayInitializerLSquare) && EndsInComma) ||
|
EndsInComma || Current.is(TT_DictLiteral) ||
|
||||||
Current.is(TT_DictLiteral) ||
|
|
||||||
Style.Language == FormatStyle::LK_Proto || !Style.BinPackArguments ||
|
Style.Language == FormatStyle::LK_Proto || !Style.BinPackArguments ||
|
||||||
(NextNoComment &&
|
(NextNoComment &&
|
||||||
NextNoComment->isOneOf(TT_DesignatedInitializerPeriod,
|
NextNoComment->isOneOf(TT_DesignatedInitializerPeriod,
|
||||||
TT_DesignatedInitializerLSquare));
|
TT_DesignatedInitializerLSquare));
|
||||||
|
BreakBeforeParameter = EndsInComma;
|
||||||
if (Current.ParameterCount > 1)
|
if (Current.ParameterCount > 1)
|
||||||
NestedBlockIndent = std::max(NestedBlockIndent, State.Column + 1);
|
NestedBlockIndent = std::max(NestedBlockIndent, State.Column + 1);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -6004,7 +6004,10 @@ TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
|
||||||
TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
|
TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
|
||||||
verifyFormat("vector<int> x{1, 2, 3, 4};");
|
verifyFormat("vector<int> x{1, 2, 3, 4};");
|
||||||
verifyFormat("vector<int> x{\n"
|
verifyFormat("vector<int> x{\n"
|
||||||
" 1, 2, 3, 4,\n"
|
" 1,\n"
|
||||||
|
" 2,\n"
|
||||||
|
" 3,\n"
|
||||||
|
" 4,\n"
|
||||||
"};");
|
"};");
|
||||||
verifyFormat("vector<T> x{{}, {}, {}, {}};");
|
verifyFormat("vector<T> x{{}, {}, {}, {}};");
|
||||||
verifyFormat("f({1, 2});");
|
verifyFormat("f({1, 2});");
|
||||||
|
@ -6049,6 +6052,17 @@ TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
|
||||||
"};");
|
"};");
|
||||||
verifyFormat("#define A {a, a},");
|
verifyFormat("#define A {a, a},");
|
||||||
|
|
||||||
|
// Binpacking only if there is no trailing comma
|
||||||
|
verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
|
||||||
|
" cccccccccc, dddddddddd};",
|
||||||
|
getLLVMStyleWithColumns(50));
|
||||||
|
verifyFormat("const Aaaaaa aaaaa = {\n"
|
||||||
|
" aaaaaaaaaaa,\n"
|
||||||
|
" bbbbbbbbbbb,\n"
|
||||||
|
" ccccccccccc,\n"
|
||||||
|
" ddddddddddd,\n"
|
||||||
|
"};", getLLVMStyleWithColumns(50));
|
||||||
|
|
||||||
// Cases where distinguising braced lists and blocks is hard.
|
// Cases where distinguising braced lists and blocks is hard.
|
||||||
verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
|
verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
|
||||||
verifyFormat("void f() {\n"
|
verifyFormat("void f() {\n"
|
||||||
|
@ -6128,10 +6142,12 @@ TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
|
||||||
" // Second element:\n"
|
" // Second element:\n"
|
||||||
" 2};",
|
" 2};",
|
||||||
getLLVMStyleWithColumns(30)));
|
getLLVMStyleWithColumns(30)));
|
||||||
// A trailing comma should still lead to an enforced line break.
|
// A trailing comma should still lead to an enforced line break and no
|
||||||
|
// binpacking.
|
||||||
EXPECT_EQ("vector<int> SomeVector = {\n"
|
EXPECT_EQ("vector<int> SomeVector = {\n"
|
||||||
" // aaa\n"
|
" // aaa\n"
|
||||||
" 1, 2,\n"
|
" 1,\n"
|
||||||
|
" 2,\n"
|
||||||
"};",
|
"};",
|
||||||
format("vector<int> SomeVector = { // aaa\n"
|
format("vector<int> SomeVector = { // aaa\n"
|
||||||
" 1, 2, };"));
|
" 1, 2, };"));
|
||||||
|
@ -6297,7 +6313,7 @@ TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
|
||||||
" aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
|
" aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
|
||||||
|
|
||||||
// No column layout should be used here.
|
// No column layout should be used here.
|
||||||
verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
|
verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
|
||||||
" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
|
" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
|
||||||
|
|
||||||
verifyNoCrash("a<,");
|
verifyNoCrash("a<,");
|
||||||
|
|
|
@ -237,7 +237,10 @@ TEST_F(FormatTestJava, EnumDeclarations) {
|
||||||
TEST_F(FormatTestJava, ArrayInitializers) {
|
TEST_F(FormatTestJava, ArrayInitializers) {
|
||||||
verifyFormat("new int[] {1, 2, 3, 4};");
|
verifyFormat("new int[] {1, 2, 3, 4};");
|
||||||
verifyFormat("new int[] {\n"
|
verifyFormat("new int[] {\n"
|
||||||
" 1, 2, 3, 4,\n"
|
" 1,\n"
|
||||||
|
" 2,\n"
|
||||||
|
" 3,\n"
|
||||||
|
" 4,\n"
|
||||||
"};");
|
"};");
|
||||||
|
|
||||||
FormatStyle Style = getStyleWithColumns(65);
|
FormatStyle Style = getStyleWithColumns(65);
|
||||||
|
|
Loading…
Reference in New Issue