================
@@ -28625,6 +28627,112 @@ TEST_F(FormatTest, BreakBinaryOperations) {
Style);
}
+TEST_F(FormatTest, BreakBinaryOperationsPerOperator) {
+ auto Style = getLLVMStyleWithColumns(60);
+
+ // Per-operator override: && and || are OnePerLine, rest is Never (default).
+ FormatStyle::BinaryOperationBreakRule LogicalRule;
+ LogicalRule.Operators = {tok::ampamp, tok::pipepipe};
+ LogicalRule.Style = FormatStyle::BBO_OnePerLine;
+ LogicalRule.MinChainLength = 0;
+
+ Style.BreakBinaryOperations.Default = FormatStyle::BBO_Never;
+ Style.BreakBinaryOperations.PerOperator = {LogicalRule};
+
+ // Logical operators break one-per-line when line is too long.
+ verifyFormat("bool valid = isConnectionReady() &&\n"
+ " isSessionNotExpired() &&\n"
+ " hasRequiredPermission();",
+ Style);
+
+ // Arithmetic operators stay with default (Never).
+ verifyFormat("int total = unitBasePrice + shippingCostPerItem +\n"
+ " applicableTaxAmount + handlingFeePerUnit;",
+ Style);
+
+ // Short logical chain that fits stays on one line.
+ verifyFormat("bool x = a && b && c;", Style);
+
+ // Multiple PerOperator groups: && and || plus | operators.
+ FormatStyle::BinaryOperationBreakRule BitwiseOrRule;
+ BitwiseOrRule.Operators = {tok::pipe};
+ BitwiseOrRule.Style = FormatStyle::BBO_OnePerLine;
+ BitwiseOrRule.MinChainLength = 0;
+
+ Style.BreakBinaryOperations.PerOperator = {LogicalRule, BitwiseOrRule};
+
+ // | operators should break one-per-line.
+ verifyFormat("int flags = OPTION_VERBOSE_OUTPUT |\n"
+ " OPTION_RECURSIVE_SCAN |\n"
+ " OPTION_FORCE_OVERWRITE;",
+ Style);
+
+ // && still works in multi-group configuration.
+ verifyFormat("bool valid = isConnectionReady() &&\n"
+ " isSessionNotExpired() &&\n"
+ " hasRequiredPermission();",
+ Style);
+
+ // + stays with default (Never) even with multi-group.
+ verifyFormat("int total = unitBasePrice + shippingCostPerItem +\n"
+ " applicableTaxAmount + handlingFeePerUnit;",
+ Style);
+
+ // | OnePerLine with << sub-expressions: << stays grouped.
+ Style.BreakBinaryOperations.PerOperator = {BitwiseOrRule};
+ verifyFormat("std::uint32_t a = byte_buffer[0] |\n"
+ " byte_buffer[1] << 8 |\n"
+ " byte_buffer[2] << 16 |\n"
+ " byte_buffer[3] << 24;",
+ Style);
+
+ // >> (stream extraction) OnePerLine: clang-format splits >> into two >
+ // tokens, but per-operator rules for >> must still work.
+ FormatStyle::BinaryOperationBreakRule ShiftRightRule;
+ ShiftRightRule.Operators = {tok::greatergreater};
+ ShiftRightRule.Style = FormatStyle::BBO_OnePerLine;
+ ShiftRightRule.MinChainLength = 0;
+
+ Style.BreakBinaryOperations.PerOperator = {ShiftRightRule};
+ verifyFormat("in >>\n"
+ " packet_id >>\n"
+ " packet_version >>\n"
+ " packet_number >>\n"
+ " packet_scale;",
+ Style);
+}
+
+TEST_F(FormatTest, BreakBinaryOperationsMinChainLength) {
+ auto Style = getLLVMStyleWithColumns(60);
+
+ // MinChainLength = 3: chains shorter than 3 don't force breaks.
+ FormatStyle::BinaryOperationBreakRule LogicalRule;
+ LogicalRule.Operators = {tok::ampamp, tok::pipepipe};
+ LogicalRule.Style = FormatStyle::BBO_OnePerLine;
+ LogicalRule.MinChainLength = 3;
+
+ Style.BreakBinaryOperations.Default = FormatStyle::BBO_Never;
+ Style.BreakBinaryOperations.PerOperator = {LogicalRule};
+
+ // Chain of 2 — below MinChainLength, no forced one-per-line.
+ verifyFormat("bool ok =\n"
+ " isConnectionReady(cfg) && isSessionNotExpired(cfg);",
+ Style);
+
+ // Chain of 3 — meets MinChainLength, one-per-line.
+ verifyFormat("bool ok = isConnectionReady(cfg) &&\n"
+ " isSessionNotExpired(cfg) &&\n"
+ " hasRequiredPermission(cfg);",
+ Style);
+
+ // Chain of 4 — above MinChainLength, one-per-line.
+ verifyFormat("bool ok = isConnectionReady(cfg) &&\n"
+ " isSessionNotExpired(cfg) &&\n"
+ " hasRequiredPermission(cfg) &&\n"
+ " isFeatureEnabled(cfg);",
+ Style);
+}
+
----------------
HazardyKnusperkeks wrote:
Can we have some `<` and `<<` tests here as well, or are they already handled
enough by the preexisting tests?
https://github.com/llvm/llvm-project/pull/181051
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits