Skip to content

Commit

Permalink
Allow switch arms to start a line with an open brace
Browse files Browse the repository at this point in the history
Fixes #57854
  • Loading branch information
sharwell committed Sep 19, 2023
1 parent dc3d069 commit 920fc47
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 12 deletions.
38 changes: 38 additions & 0 deletions src/Workspaces/CSharpTest/Formatting/FormattingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10086,6 +10086,44 @@ public bool IsFoo(A a)
}", changedOptionSet: changingOptions);
}

[Fact, Trait(Traits.Feature, Traits.Features.Formatting)]
[WorkItem(57854, "https://github.com/dotnet/roslyn/issues/57854")]
public async Task NewLinesForBraces_PropertyPatternClauses_NonDefaultInSwitchExpression()
{
var changingOptions = new OptionsCollection(LanguageNames.CSharp)
{
{ NewLineBeforeOpenBrace, NewLineBeforeOpenBrace.DefaultValue.WithFlagValue(NewLineBeforeOpenBracePlacement.ObjectCollectionArrayInitializers, false) },
};
await AssertFormatAsync(
@"
class A
{
public string Name { get; }
public bool IsFoo(A a)
{
return a switch {
{ Name: ""foo"" } => true,
_ => false,
};
}
}",
@"
class A
{
public string Name { get; }
public bool IsFoo(A a)
{
return a switch
{
{ Name: ""foo"" } => true,
_ => false,
};
}
}", changedOptionSet: changingOptions);
}

[Theory, CombinatorialData]
[WorkItem("https://github.com/dotnet/roslyn/issues/52413")]
public async Task NewLinesForBraces_PropertyPatternClauses_SingleLine(bool option)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,18 +127,38 @@ private static bool IsControlBlock(SyntaxNode node)
}

// new { - Object Initialization, or with { - Record with initializer, or is { - property pattern clauses
if (currentToken.IsKind(SyntaxKind.OpenBraceToken) &&
currentToken.Parent.Kind() is
SyntaxKind.ObjectInitializerExpression or
SyntaxKind.CollectionInitializerExpression or
SyntaxKind.ArrayInitializerExpression or
SyntaxKind.ImplicitArrayCreationExpression or
SyntaxKind.WithInitializerExpression or
SyntaxKind.PropertyPatternClause)
{
if (!_options.NewLines.HasFlag(NewLinePlacement.BeforeOpenBraceInObjectCollectionArrayInitializers))
{
operation = CreateAdjustSpacesOperation(1, AdjustSpacesOption.ForceSpaces);
if (currentToken.IsKind(SyntaxKind.OpenBraceToken))
{
if (currentToken.Parent.Kind() is SyntaxKind.ObjectInitializerExpression
or SyntaxKind.CollectionInitializerExpression
or SyntaxKind.ArrayInitializerExpression
or SyntaxKind.ImplicitArrayCreationExpression
or SyntaxKind.WithInitializerExpression)
{
if (!_options.NewLines.HasFlag(NewLinePlacement.BeforeOpenBraceInObjectCollectionArrayInitializers))
{
operation = CreateAdjustSpacesOperation(1, AdjustSpacesOption.ForceSpaces);
}
}
else if (currentToken.Parent.IsKind(SyntaxKind.PropertyPatternClause))
{
if (!_options.NewLines.HasFlag(NewLinePlacement.BeforeOpenBraceInObjectCollectionArrayInitializers))
{
// Allow property patterns in switch expressions to start on their own line:
//
// var x = y switch {
// { Value: true } => false, ⬅️ This line starts with an open brace
// _ => true,
// };
var isFirstTokenOfSwitchArm = currentToken.Parent.IsParentKind(SyntaxKind.RecursivePattern, out RecursivePatternSyntax? recursivePattern)
&& recursivePattern.IsParentKind(SyntaxKind.SwitchExpressionArm, out SwitchExpressionArmSyntax? switchExpressionArm)
&& switchExpressionArm.GetFirstToken() == currentToken;

var spacesOption = isFirstTokenOfSwitchArm
? AdjustSpacesOption.ForceSpacesIfOnSingleLine
: AdjustSpacesOption.ForceSpaces;
operation = CreateAdjustSpacesOperation(1, spacesOption);
}
}
}

Expand Down

0 comments on commit 920fc47

Please sign in to comment.