<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/118554>118554</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [clang-format] Add additional format options to break before commas, and align under top bracket
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-format
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          d3x0r
      </td>
    </tr>
</table>

<pre>
    https://github.com/d3x0r/llvm-project/tree/d3x0r-add-comma-as-binary-operator is my WIP branch, there are some things I see that could be fixed, or behave better...

- `BreakBeforeComma: true`  New option, similar to `BreakBeforeBinaryOperators` or `BreakBeforeBraces`.  This adds the binary operator behavior to the tok::comma; it also increases the splitPenalty before ',' and the subsequent token, which drags the comma to the next line. It inherits formatting behaviors of Binary operators by becoming a binary operator, otherwise, it gets ContinuationIndentWidth sort of indenting.  I could see where those tests are and make them more specific, rather than making comma a binary operator, but I think it actually fits well.

- `AlignAfterOpenBracket: AlignTop` AlignAfterOpenBracket has a few values it can be `true`, 'Align', 'DontAlign', 'AlwaysBreak', 'BlockIndent'.  I would like to maybe add 'AlignTop' as a variation of 'Align'.  Align puts arguments that are wrapped under each other, AlignTop would put the wrapped line under the open bracket instead.

Align
```
someLongFunction(argument1,
 argument2);
```

AlignTop
```
someLongFunction(argument1,
 argument2);
```


AlignTop, __BreakBeforeComma__, SpacesInParensOptions:  (InConditionalStatements: true   Other: true)

```
someLongFunction( argument1
                , argument2 );
```


---

I don't understand why this line gets formatted this way.... (lots of tabs deleted before, since github tabsize is fixed 8)

```
        out.data.size
                  = snprintf( out.data.data, 32, "\x1b[%s;%sR",
                       y ? GetText( y ) : "0" // col
         ,
                       x ? GetText( x ) : "0" ); // row
        this.on( & this.common.Output
               , SegDuplicate( ( PTEXT ) & out ) );
```
Why does the above get a lone comma get put on the line like that?  There's something to do with a comment token , but I don't get it



This is 2 levels of tab indented, and UseTabs is AlignWithSpaces, `ContinuationIndentWidth: 5` , and TabSize:3 ; so the following gets a ContinuationIndentWidth of 5, which is an Indent somehow that gets converted to a tab and 2 spaces.... that continuationindent should be space filled always...
```
\t\tconst simpleContent
\t\t\t  = content.replace( "\r\n", "\n" ).replace( "\r", "\n" );
```


a more detailed look at the above 'snprintf' This also had a continuation indent , but all of the arguments under the snprintf were space aligned correctly with space fill.... 

```
.\tout.data.size
.\t.\t  = snprintf( out.data.data, 32, "\x1b[%s;%sR",
.\t               y ? GetText( y ) : "0" // col
.\t ,
.\t               x ? GetText( x ) : "0" ); // row

```


I did add some unit tests... these are some other examples.
https://github.com/d3x0r/llvm-project/blob/d3x0r-add-comma-as-binary-operator/clang/unittests/Format/FormatTestComma.cpp

All existing format tests pass when none of the above options are used (as they should).

I'm also not sure about the documentation - seems like maybe it's extracted from the header files?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV1tv47oR_jXMy8CCQsWXPPjBydaFgaJZdF1s3xaUNLLYUKRKUrHdX1_MULKzPsmi7TnBemHzMtdvvhmqEPTBIq7F_EnMv9ypIbbOr-vilPu70tXndRtjH0SxEXIr5PagYzuUWeU6Ibd8SsitMW_drPfun1hFIbfRI067M1XXs8p1nZqpMCu1Vf48cz16FZ0HHaA7w_fdVyi9slUr5DPEFj2C8gjBdQix1fYQYAcB6YeKULnB1FAiNPqENV1xHkps1RtCiTGiz7JM5BuRb2YgFvmTR_X6hI3z-EyGiGID0Q8oFjnAX_EIro_aWRIUdKeN8hDdzcUnNvxltDvQVedvz3hVIW1lAPtWB1B1HcgdSG7DxW02VjvWQ_vRvVKAi02V7HsCHUGZ4EDbyqMKmOSE3uj4Fa0y8QwlKwUhl0I-C7kEZet0aigD_mtAG0kwsmPHVlct1F4dkiRWNKm3eIpgtMUMdhG0bdHrGKBxvlMxanu4GBzANfD0szcBSjKmch2dVLfOcn4op0cdkH7oCAeMAZ6djdoOimK_szXa-F3XsYXgfCQ1mte0PWQAuzHphIEj4yO2LiBEDDEwVsj5Tr3SBnbQUWRCj5VudEVKvSITCD-WjpGlKQQf2lsOEXaMvFfORBUHZcwZGgrLEY15D6-N0Qe7aSL6lx4tgeAVI2GMN_auJ7B8eAhaFUBBg0d4U2bAQMoqZQnbYpGPGCWDhFyyhJRs-vnF2XiztDFHdQ4MyOvik3HVawqvkEsO5ZFDaTQFy0GnziUSVC9KyGSCE9n2przmDFFG3lmRQXIJ-oETcBg6tDGkAqV8HL3qe6xhsDV6QFW1CQVk1qRltKQfIsNwukJIHO_RsuvREj1wxLQNEVU9xj9Zk28oSulfviHS-Iuzh-1gq1TWq8m8eyqUfHMxVwr5KIqnGwGTXArDHy_6vXT5DD9-3LLTjx-0_q0nLtnZr8qjDS9MUETCAEKudvbZ2VrTmjLfoorIwZ94DQBeONQTz8nHUfevfYGrM_kGbv7IqItz8AvvZrNZ-rKDmsQuY8pliFSix_ZMdRVSkpkHRprBOm0c1TnLsoz8NC4y4URVBqjRIB1KtJfI2lYIqSHxGf1vpI7CbQFWH7ot8kc3xKxWUWV0Pi2J_BFAFF8g2N5rGxuKxuUc_Uf6CplqSor58-m-pIYp54HiIOfhb7TOGGBhP_2dQRRb-DPGPZ4iiT5TAIHyI6TMhaSAUnOFyplRwmeyTreyTh_IouRMIr07JkEU3SwlWsgFB5vaeOds9jLEfog_6WMQ4uHL0BtdqYjp2gq-7v_0j31SKRcUo_H7B3j43p6hdmPrUqV744SDAuPs1IFogerfWT7FqEjM1KpInsKe6F7IZeBxgKcBoq3awVHHFhQLuvQ6uNL3hD5SoeMFnyLfcHPWASQYfEMzYWzsOGmkILD-PeCeoKdDoqzvOrapMBkIi_yTFkbJmBPrT4L2qvxGYCs2BVBqQuq7jTPGHckhLgT1aUt0DcyvXZwmCwtpn4PSumMiXhZTOfuGnuvJgWLHyAYJgU3n4hrnqKs2PUprp9mKD0OjjcEaFHeWcap6X03z50ifytkQaXjqDZIP1Gyuu_RJ5VWlvcxjb1Q1YorKyYv5s00VNK7YEckfnf3o3Gd0pNIsUGNUmlwxzr2Ciu8wSdi6lP1ynNxo9mpVzfC6RmlEyAVkyhjGDsm6tMBr55rEwhH9FFFFQMIaKuc9VtGcE4yv4U7k9xviyiiKt9TFi9k1vn8EfY3ifheBJRmfy_u_SeyDBO-g1jXPL_xcGKyOaSxMOMfw7i3BEwjgSRFQA6H5f3_clMaV_9XjRshtZZQ9CLklo9gmIbdbbneXL3sMkft-VvX9NB8YwJMOPHmn7jgOur0KgeZfC5YodIIewzg9YtIwPASkcW6lmHvPY1lTNY0xE3LZJZBbFyEMnqWMc1jtKoZygvyMhu4uJFZOw6KOzMd4il5VRDSNdx1fbVER-BttMIhie1evi_qxeFR3uL5fFoVcFIvl8q5dP6xWzfJBLh7mjw-ralnUy_tHqUp53ywfS7Wa3-m1zOXDvcwLKfPlfJkVxX2jqkWVV1gUVd6Ihxw7pU1G6cmcP9zpEAZc39-v5vOHO6NKNIEftVJyGmbNGHhJz1y_5rSWwyGIh9xowstFUtTR8IP4p4vzL7CpGWnj5DXlZop8dFDSMDe9zBgYYeoBXPgTObh-mmjvBm9-9cQmo34LQvaV0DS6-7aW_wkAAP__XA0Baw">