Issue #2801: SA1500 fires for the while clause of do/while statement#3196
Issue #2801: SA1500 fires for the while clause of do/while statement#3196sharwell merged 5 commits intoDotNetAnalyzers:masterfrom
Conversation
…hile statement
Provide new configuration setting, `layoutRules.allowDoWhileOnClosingBrace` such that when enabled, the following will be allowed:
```
do
{
Console.WriteLine("test");
} while (false);
```
Codecov Report
@@ Coverage Diff @@
## master #3196 +/- ##
==========================================
- Coverage 93.44% 93.40% -0.04%
==========================================
Files 1029 1029
Lines 111035 111170 +135
Branches 3934 3940 +6
==========================================
+ Hits 103754 103841 +87
- Misses 6266 6268 +2
- Partials 1015 1061 +46 |
| var nextToken = braceToken.GetNextToken(); | ||
| var nextTokenLine = nextToken.IsKind(SyntaxKind.None) ? -1 : LocationHelpers.GetLineSpan(nextToken).StartLinePosition.Line; | ||
| var isMultiDimensionArrayInitializer = braceToken.IsKind(SyntaxKind.OpenBraceToken) && braceToken.Parent.IsKind(SyntaxKind.ArrayInitializerExpression) && braceToken.Parent.Parent.IsKind(SyntaxKind.ArrayInitializerExpression); | ||
| var allowDoWhileOnClosingBrace = settings.LayoutRules.AllowDoWhileOnClosingBrace && nextToken.IsKind(SyntaxKind.WhileKeyword) && (braceToken.Parent?.IsKind(SyntaxKind.Block) ?? false) && (braceToken.Parent.Parent?.IsKind(SyntaxKind.DoStatement) ?? false); |
There was a problem hiding this comment.
This line shows only partial code coverage from the Unit Tests and would be the reason for the decrease in Codecov.
The reason is because there isn't a test in which the braceToken.Parent is null. I'm not completely familiar with the flow of execution and what is possible and what isn't, so I wrote this just being safe. I suppose, given the SyntaxTree, it may be impossible for braceToken.Parent to be null, but I just don't know. I tried to write some Unit Tests that had malformed syntax and they would fail with a compiler error.
If someone is sure that braceToken.Parent can never be null, then I'd be happy to change it. I know the line of code right above this also uses braceToken.Parent without the Null-Conditional operator, but I wasn't sure if the fact that it is applicable to a Multi-Dimensional Array Initializer, that the syntax may be different. So I just wanted to be extra safe.
But we can remove it if we want the Codcov percentage to go back up.
documentation/Configuration.md
Outdated
| | --- | --- | --- | --- | | ||
| | `newlineAtEndOfFile` | `"allow"` | 1.0.0 | Specifies the handling for newline characters which appear at the end of a file | | ||
| | `allowConsecutiveUsings` | `true` | 1.1.0 | Specifies if SA1519 will allow consecutive using statements without braces | | ||
| | `allowDoWhileOnClosingBrace` | `false` | >1.2.0 | Specifies if SA1500 will allow the `while` expression of a `do-while` loop to be on the same line as the closing brace, as is generated by the default code snippet of Visual Studio | |
There was a problem hiding this comment.
|
@Kevin-Andrew I may still merge this. Let me give it some thought today. |
There was a problem hiding this comment.
Since I don't know the syntax tree well enough, I just want to make sure, as I had similar code and this same question elsewhere, "Is using .Parent.Parent safe here?" We know that openBraceToken.Parent is not null and is of kind Block, but does that guarantee that .Parent.Parent will never be null? For example what if I have code like the following that uses some extra curly braces for scoping:
{ // Some braces for scoping
var x = 0;
do
{
x = 1;
} while (x == 0);
}
There was a problem hiding this comment.
IsKind allows null, and openBraceToken.Parent.IsKind(SyntaxKind.Block) is only true if openBraceToken.Parent is not null.
|
Thanks for looking at this @sharwell. I see that one of the required automation builds is failing. |
|
I restarted the build, and it should pass this time. I'm guessing our timeout is too short to handle all cases, but I can increase it. |
) Updated [StyleCop.Analyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers) from 1.2.0-beta.333 to 1.2.0-beta.556. <details> <summary>Release notes</summary> _Sourced from [StyleCop.Analyzers's releases](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/releases)._ ## 1.2.0-beta.556 ## What's Changed * Update SA1011 to forbid trailing space before the end of a switch case by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3674 * Rewrite IOperationWrapper as a wrapper structure around IOperation by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3611 * Update SA1202 to support interfaces (C# 8) and records (C# 9, 10) by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3694 * Update documentation for SA1308 to also mention prefix "t_" by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3697 * Update SA1642 and its code fix to handle record structs correctly by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3696 * Update dependencies by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3700 * Mark several test classes as partial by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3702 * Add missing test files and fix inheritance by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3703 * Generate and validate derived test classes by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3704 * Update SA1011 to not require space before a range operator by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3709 * Update SA1131 to treat methods as constants by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3710 * Avoid allocations in CanWrap... methods by @martin-strecker-sonarsource in DotNetAnalyzers/StyleCopAnalyzers#3711 * Update SA1648 to accept inheritdoc on members implemented from static abstract/virtual interface members by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3715 * Update SA1600 to also handle records by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3725 * Update SA1119 to allow parenthesis around a ref ternary conditional expression when it is the left-hand side of an assigment by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3737 * Update SA1119 to allow parenthesized switch expressions followed by an invocation by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3733 * Add c# 12 test project by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3734 * Run tests in parallel jobs by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3740 * Update SA1010 to accept whitespace before collection initializers by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3745 * Update SA1513 to not require a blank line if the closing brace is at the end of a collection expression by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3746 * Update SA1118 to allow multi-line collection expressions by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3749 * Update SA1009 to require a space after the closing parenthesis if it is followed by ++ or -- from a prefix unary expression by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3750 * Update SA1008 to allow space before the opening parenthesis of a using alias definition of a tuple type by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3748 * Update documentation for SA1102 to contain compilable code examples by @arphox in DotNetAnalyzers/StyleCopAnalyzers#3755 * Update SA1008 to not crash if there is no previous token by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3741 * Change default value of test property CodeActionValidationMode to SemanticStructure instead of None and update so that tests still pass by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3753 * Allow inheritdoc for class constructors with base types by @MartyIX in DotNetAnalyzers/StyleCopAnalyzers#3719 * Fix that SA1134 Fix All maybe non-deterministic by @pdelvo in DotNetAnalyzers/StyleCopAnalyzers#2853 * Coverage improvements by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3675 * Fix SA1131 to not treat "complex" expressions as a literal by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3760 ## New Contributors * @martin-strecker-sonarsource made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3711 * @arphox made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3755 * @MartyIX made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3719 **Full Changelog**: DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.507...1.2.0-beta.556 ## 1.2.0-beta.507 ## What's Changed * Update to StyleCop.Analyzers 1.2.0-beta.435 by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3499 * Add c# 11 test project to opencover-report.ps1 by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3506 * Use GetText instead of ToFullString by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3514 * Keep tracked nodes in a list by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3525 * Remove unnecessary nullable directives by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3530 * Remove hard-coded language versions in test projects for c# 8, 9 and 10 by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3528 * Update SA1515 to not let one range of trivia affect another by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3529 * Mentioned VS 2022 by @twojnarowski in DotNetAnalyzers/StyleCopAnalyzers#3549 * Remove byte order mark from schema file by @martincostello in DotNetAnalyzers/StyleCopAnalyzers#3562 * Update SA1012 to expect no space between a property pattern's opening brace and an enclosing list pattern's opening bracket by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3511 * Update Microsoft.CodeAnalysis.CSharp.Workspaces to version 4.4.0 for the c# 11 test project by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3580 * Update SA1008 to handle positional patterns inside property patterns by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3579 * Update SA1000 to trigger after keywords is, or, and, not by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3585 * Update SA1000.md by @Youssef1313 in DotNetAnalyzers/StyleCopAnalyzers#3563 * Update SA1313 to also allow incorrect names in explicitly implemented methods from interfaces by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3569 * Update SA1023 to not trigger first in line, inside a foreach without braces by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3543 * Update SA1400 to recognize access modifier "file" by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3590 * Update SA1206 to recognize modifier "file" by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3591 * Update SA1000 to handle checked operator declarations correctly by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3505 * Update SA1402 to handle records and record structs by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3570 * Bump Newtonsoft.Json from 12.0.3 to 13.0.2 in /StyleCop.Analyzers/StyleCop.Analyzers.Status.Generator by @dependabot in DotNetAnalyzers/StyleCopAnalyzers#3584 * Update to the latest version of the testing library by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3601 * Update so that SA1600 tests will be run with the expected language version in test projects for c# 8 and above by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3614 * Update reading of file_header_template and stylecop.documentation.copyrightText to allow multiple lines by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3617 * Update SA1015 to require trailing space after an explicit generic return type in a lambda expression by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3625 * Update to Microsoft.CodeAnalysis.Analyzers 3.3.5-beta1.23205.2 by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3628 * Update SA1206 to handle c# 11 modifier "required" by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3535 * Preparations for SettingsHelper optimizations by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3635 * Correct SA1515 to not fire on the second line of a file header by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3633 * Update AnalyzersExtensions and SettingsHelper to use cached JsonValue objects where possible by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3642 * Update SA1010 to not trigger on list patterns by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3507 * Update NamingSettings and DocumentationSettings to keep one Regex instance instead of calling Regex.IsMatch by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3639 * Use ResxSourceGenerator for resource generation by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3343 * Make XmlCommentHelper faster by @ninedan in DotNetAnalyzers/StyleCopAnalyzers#3651 * Update RenameToUpperCaseCodeFixProvider to not offer a code fix if the identifier only consists of underscores by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3637 * Don't emit SA1414 for interface implementations by @CollinAlpert in DotNetAnalyzers/StyleCopAnalyzers#3644 * Support file-scoped namespaces in SA1516 by @JakubLinhart in DotNetAnalyzers/StyleCopAnalyzers#3513 * Update SA1137 to also consider init accessors by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3669 * Update SA1500 to also consider init accessors by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3670 * Update SA1513 to not trigger before an init accessor by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3666 * Update SA1212 to also trigger for an init accessor before a getter by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3661 * Update SA1513 codefix to use the existing newline character sequence by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3607 * Correct code fix for SA1130 when delegate expression is part of a cast expression by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3516 * Update so that c# 7 tests will be run with the expected language version in test projects for c# 8 and above by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3616 * SA1629 should allow full-sentence links instead of forcing the period to glow white by @jnm2 in DotNetAnalyzers/StyleCopAnalyzers#3371 ## New Contributors * @twojnarowski made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3549 * @ninedan made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3651 ... (truncated) ## 1.2.0-beta.435 ## What's Changed * Update to Microsoft.CodeAnalysis.Testing 1.1.1-beta1.22081.4 by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3450 * Update SA1600 to show inheritance example. by @codajo in DotNetAnalyzers/StyleCopAnalyzers#3385 * Enable nullable reference types by default by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3455 * Disable SA0002 (Invalid settings file) for empty projects by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3456 * Support awaiting a parenthesized 'switch' or 'with' expression by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3462 * Fix support for object initializers in interpolations by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3463 * Fix typo in SA1307.md by @marcospgp in DotNetAnalyzers/StyleCopAnalyzers#3466 * Map dotnet_separate_import_directive_groups=false to OptionSetting.Allow by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3484 * Support extended property patterns in SA1101 by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3483 * Fix false positive in SA1516 between global statements by @maxkoshevoi in DotNetAnalyzers/StyleCopAnalyzers#3482 * Fix handling of generic delegates in file type name by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3485 * Collect incremental state without passing compilation to output stage by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3452 * Updated code fix name for SA1027 to be ok regardless of the 'useTabs' setting by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3490 * Corrected documentation for SA1516 by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3488 * Updated SA1009 to forbid space after a closing parenthesis in a method reference contained in single quotes by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3497 * Added a new test project for c# 11 by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3491 * Remove same values at SA1201ElementsMustAppearInTheCorrectOrder.MemberNames by @eliseevev in DotNetAnalyzers/StyleCopAnalyzers#3496 * Updated SA1015 analyzer to handle generic attributes (c# 11 preview) by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3494 * Updated SA1008 to handle tuples in logical patterns by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3495 ## New Contributors * @codajo made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3385 * @marcospgp made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3466 * @maxkoshevoi made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3482 * @eliseevev made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3496 **Full Changelog**: DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.406...1.2.0-beta.435 ## 1.2.0-beta.406 ## What's Changed * Increase test coverage for records in SA1500, SA1502, and SA1508 by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3421 * Add 'allowDoWhileOnClosingBrace' configuration to the JSON schema by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3423 * Use CultureInfo.InvariantCulture for en-US by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3426 * Allow direct use of explicit parameterless constructors by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3432 * Support file-scoped namespaces in SA1649 and SA1402 by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3436 * Add file-scoped namespace support to SA1208 in DotNetAnalyzers/StyleCopAnalyzers#3438 * Expand support for file scoped namespaces by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3446 * Insert blank line before using directives in file-scoped namespace by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3447 **Full Changelog**: DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.376...1.2.0-beta.406 ## 1.2.0-beta.376 ## What's Changed * Update System.Collections.Immutable in the status generator by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3362 * Update to Microsoft.CodeAnalysis.Testing 1.1.0-beta1.21329.1 by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3361 * SA1130: Handle optional named arguments correctly by @wdolek in DotNetAnalyzers/StyleCopAnalyzers#3289 * Add C# 10 test project by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3398 * Support C# 10 'record struct' by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3401 * Update SA1116 and SA1117 to handle target-typed new (C# 9) by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3408 * Use reference assemblies for index and range by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3417 * Update SA1119 to support C# Ranges by @pantosha in DotNetAnalyzers/StyleCopAnalyzers#3372 * Allow object initializers and switch expressions in throw statements by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3418 * Update to Roslyn 4, .NET SDK 6.0.100 by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3416 * Update SA1135 to support file-scoped namespaces by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3419 * Fix ignored Namespace attribute in OperationLightupGenerator by @pavel-mikula-sonarsource in DotNetAnalyzers/StyleCopAnalyzers#3378 * Update SA1003 and SA1008 to not require space before a cast inside a range expression by @bjornhellander in DotNetAnalyzers/StyleCopAnalyzers#3409 ## New Contributors * @wdolek made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3289 * @pavel-mikula-sonarsource made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3378 **Full Changelog**: DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.354...1.2.0-beta.376 ## 1.2.0-beta.354 ## What's Changed * Update SA1305 doc to mention allowedHungarianPrefixes in stylecop.json by @Youssef1313 in DotNetAnalyzers/StyleCopAnalyzers#3321 * Implement custom fix all providers by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3322 * Handle new() syntax on SA1118 by @BlythMeister in DotNetAnalyzers/StyleCopAnalyzers#3340 * Support defining options in .editorconfig by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3285 * Set TLS defaults for testing by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3342 * Update to Microsoft.CodeAnalysis.Testing 1.0.1-beta1.21202.2 by @sharwell in DotNetAnalyzers/StyleCopAnalyzers#3341 * Issue #2801: SA1500 fires for the while clause of do/while statement by @Kevin-Andrew in DotNetAnalyzers/StyleCopAnalyzers#3196 ## New Contributors * @BlythMeister made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3340 * @Kevin-Andrew made their first contribution in DotNetAnalyzers/StyleCopAnalyzers#3196 **Full Changelog**: DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.333...1.2.0-beta.354 Commits viewable in [compare view](DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.333...1.2.0-beta.556). </details> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>



Provide new configuration setting,
layoutRules.allowDoWhileOnClosingBracesuch that when enabled, the following will be allowed:See Issue #2801.