Typz created this revision. Typz added reviewers: krasimir, djasper, klimek.
This patch changes the behavior of PenaltyBreakBeforeFirstCallParameter so that is does not apply when the brace comes after an assignment. This way, variable initialization is wrapped more like an initializer than like a function call, which seems more consistent with user expectations. With PenaltyBreakBeforeFirstCallParameter=200, this gives the following code: (with Cpp11BracedListStyle=false) Before : const std::unordered_map<std::string, int> Something::MyHashTable = { { "aaaaaaaaaaaaaaaaaaaaa", 0 }, { "bbbbbbbbbbbbbbbbbbbbb", 1 }, { "ccccccccccccccccccccc", 2 } }; After : const std::unordered_set<std::string> Something::MyUnorderedSet = { { "aaaaaaaaaaaaaaaaaaaaa", 0 }, { "bbbbbbbbbbbbbbbbbbbbb", 1 }, { "ccccccccccccccccccccc", 2 } }; Repository: rC Clang https://reviews.llvm.org/D43290 Files: lib/Format/TokenAnnotator.cpp unittests/Format/FormatTest.cpp Index: unittests/Format/FormatTest.cpp =================================================================== --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -6650,6 +6650,15 @@ "};"); verifyFormat("#define A {a, a},"); + // Avoid breaking between equal sign and opening brace + FormatStyle avoidBreakingFirstArgument = getLLVMStyle(); + avoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; + verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" + " {\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" + " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" + " {\"ccccccccccccccccccccc\", 2}};", + avoidBreakingFirstArgument); + // Binpacking only if there is no trailing comma verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" " cccccccccc, dddddddddd};", @@ -6806,6 +6815,15 @@ verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); + + // Avoid breaking between equal sign and opening brace + ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; + verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" + " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" + " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" + " { \"ccccccccccccccccccccc\", 2 }\n" + "};", + ExtraSpaces); } TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { @@ -6867,6 +6885,14 @@ " 3, cccccccccccccccccccccc};", getLLVMStyleWithColumns(60)); + // Do not break between equal and opening brace. + FormatStyle avoidBreakingFirstArgument = getLLVMStyleWithColumns(43); + avoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; + avoidBreakingFirstArgument.ColumnLimit = 43; + verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", + avoidBreakingFirstArgument); + // Trailing commas. verifyFormat("vector<int> x = {\n" " 1, 1, 1, 1, 1, 1, 1, 1,\n" Index: lib/Format/TokenAnnotator.cpp =================================================================== --- lib/Format/TokenAnnotator.cpp +++ lib/Format/TokenAnnotator.cpp @@ -2180,6 +2180,8 @@ if (Left.opensScope()) { if (Style.AlignAfterOpenBracket == FormatStyle::BAS_DontAlign) return 0; + if (Left.Previous && Left.Previous->is(tok::equal)) + return 19; return Left.ParameterCount > 1 ? Style.PenaltyBreakBeforeFirstCallParameter : 19; }
Index: unittests/Format/FormatTest.cpp =================================================================== --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -6650,6 +6650,15 @@ "};"); verifyFormat("#define A {a, a},"); + // Avoid breaking between equal sign and opening brace + FormatStyle avoidBreakingFirstArgument = getLLVMStyle(); + avoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; + verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" + " {\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" + " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" + " {\"ccccccccccccccccccccc\", 2}};", + avoidBreakingFirstArgument); + // Binpacking only if there is no trailing comma verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" " cccccccccc, dddddddddd};", @@ -6806,6 +6815,15 @@ verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); + + // Avoid breaking between equal sign and opening brace + ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; + verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" + " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" + " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" + " { \"ccccccccccccccccccccc\", 2 }\n" + "};", + ExtraSpaces); } TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { @@ -6867,6 +6885,14 @@ " 3, cccccccccccccccccccccc};", getLLVMStyleWithColumns(60)); + // Do not break between equal and opening brace. + FormatStyle avoidBreakingFirstArgument = getLLVMStyleWithColumns(43); + avoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; + avoidBreakingFirstArgument.ColumnLimit = 43; + verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", + avoidBreakingFirstArgument); + // Trailing commas. verifyFormat("vector<int> x = {\n" " 1, 1, 1, 1, 1, 1, 1, 1,\n" Index: lib/Format/TokenAnnotator.cpp =================================================================== --- lib/Format/TokenAnnotator.cpp +++ lib/Format/TokenAnnotator.cpp @@ -2180,6 +2180,8 @@ if (Left.opensScope()) { if (Style.AlignAfterOpenBracket == FormatStyle::BAS_DontAlign) return 0; + if (Left.Previous && Left.Previous->is(tok::equal)) + return 19; return Left.ParameterCount > 1 ? Style.PenaltyBreakBeforeFirstCallParameter : 19; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits