Skip to content

Commit 6c1d9b8

Browse files
committed
Check for trailing commas in multiline switch expressions
Fixes #3056
1 parent 34c2672 commit 6c1d9b8

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp8/MaintainabilityRules/SA1413CSharp8UnitTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,59 @@
33

44
namespace StyleCop.Analyzers.Test.CSharp8.MaintainabilityRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.CSharp;
9+
using Microsoft.CodeAnalysis.Testing;
610
using StyleCop.Analyzers.Test.CSharp7.MaintainabilityRules;
11+
using Xunit;
12+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
13+
StyleCop.Analyzers.MaintainabilityRules.SA1413UseTrailingCommasInMultiLineInitializers,
14+
StyleCop.Analyzers.MaintainabilityRules.SA1413CodeFixProvider>;
715

816
public class SA1413CSharp8UnitTests : SA1413CSharp7UnitTests
917
{
18+
[Fact]
19+
[WorkItem(3056, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3056")]
20+
public async Task TestSwitchExpressionAsync()
21+
{
22+
var testCode = @"namespace TestNamespace
23+
{
24+
public class TestClass
25+
{
26+
public void TestMethod(int input)
27+
{
28+
int data1 = input switch { 0 => 1, 1 => 2 };
29+
int data2 = input switch { 0 => 1, 1 => 2, };
30+
int data3 = input switch
31+
{
32+
0 => 1,
33+
[|1 => 2|]
34+
};
35+
}
36+
}
37+
}
38+
";
39+
40+
var fixedCode = @"namespace TestNamespace
41+
{
42+
public class TestClass
43+
{
44+
public void TestMethod(int input)
45+
{
46+
int data1 = input switch { 0 => 1, 1 => 2 };
47+
int data2 = input switch { 0 => 1, 1 => 2, };
48+
int data3 = input switch
49+
{
50+
0 => 1,
51+
1 => 2,
52+
};
53+
}
54+
}
55+
}
56+
";
57+
58+
await VerifyCSharpFixAsync(LanguageVersion.CSharp8, testCode, DiagnosticResult.EmptyDiagnosticResults, fixedCode, CancellationToken.None).ConfigureAwait(false);
59+
}
1060
}
1161
}

StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1413UseTrailingCommasInMultiLineInitializers.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace StyleCop.Analyzers.MaintainabilityRules
1111
using Microsoft.CodeAnalysis.CSharp.Syntax;
1212
using Microsoft.CodeAnalysis.Diagnostics;
1313
using StyleCop.Analyzers.Helpers;
14+
using StyleCop.Analyzers.Lightup;
1415

1516
/// <summary>
1617
/// A multi-line initializer should use a comma on the last item.
@@ -59,6 +60,7 @@ internal class SA1413UseTrailingCommasInMultiLineInitializers : DiagnosticAnalyz
5960
private static readonly Action<SyntaxNodeAnalysisContext> HandleObjectInitializerAction = HandleObjectInitializer;
6061
private static readonly Action<SyntaxNodeAnalysisContext> HandleAnonymousObjectInitializerAction = HandleAnonymousObjectInitializer;
6162
private static readonly Action<SyntaxNodeAnalysisContext> HandleEnumDeclarationAction = HandleEnumDeclaration;
63+
private static readonly Action<SyntaxNodeAnalysisContext> HandleSwitchExpressionAction = HandleSwitchExpression;
6264

6365
private static readonly ImmutableArray<SyntaxKind> ObjectInitializerKinds =
6466
ImmutableArray.Create(SyntaxKind.ObjectInitializerExpression, SyntaxKind.ArrayInitializerExpression, SyntaxKind.CollectionInitializerExpression);
@@ -76,6 +78,7 @@ public override void Initialize(AnalysisContext context)
7678
context.RegisterSyntaxNodeAction(HandleObjectInitializerAction, ObjectInitializerKinds);
7779
context.RegisterSyntaxNodeAction(HandleAnonymousObjectInitializerAction, SyntaxKind.AnonymousObjectCreationExpression);
7880
context.RegisterSyntaxNodeAction(HandleEnumDeclarationAction, SyntaxKind.EnumDeclaration);
81+
context.RegisterSyntaxNodeAction(HandleSwitchExpressionAction, SyntaxKindEx.SwitchExpression);
7982
}
8083

8184
private static void HandleEnumDeclaration(SyntaxNodeAnalysisContext context)
@@ -120,5 +123,19 @@ private static void HandleAnonymousObjectInitializer(SyntaxNodeAnalysisContext c
120123
context.ReportDiagnostic(Diagnostic.Create(Descriptor, initializer.Initializers.Last().GetLocation()));
121124
}
122125
}
126+
127+
private static void HandleSwitchExpression(SyntaxNodeAnalysisContext context)
128+
{
129+
var switchExpression = (SwitchExpressionSyntaxWrapper)context.Node;
130+
if (switchExpression.SyntaxNode == null || !switchExpression.SyntaxNode.SpansMultipleLines())
131+
{
132+
return;
133+
}
134+
135+
if (switchExpression.Arms.SeparatorCount < switchExpression.Arms.Count)
136+
{
137+
context.ReportDiagnostic(Diagnostic.Create(Descriptor, switchExpression.Arms.Last().SyntaxNode.GetLocation()));
138+
}
139+
}
123140
}
124141
}

0 commit comments

Comments
 (0)