Skip to content

Commit 0ad5ea0

Browse files
Merge pull request #41 from bjornhellander/feature/sa1413-collection-expression
Update SA1413UseTrailingCommasInMultiLineInitializers to also analyze collection expressions
2 parents 3627731 + 7172033 commit 0ad5ea0

File tree

6 files changed

+74
-10
lines changed

6 files changed

+74
-10
lines changed

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp12/MaintainabilityRules/SA1413CSharp12UnitTests.cs

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

44
namespace StyleCop.Analyzers.Test.CSharp12.MaintainabilityRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.Testing;
69
using StyleCop.Analyzers.Test.CSharp11.MaintainabilityRules;
10+
using Xunit;
11+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
12+
StyleCop.Analyzers.MaintainabilityRules.SA1413UseTrailingCommasInMultiLineInitializers,
13+
StyleCop.Analyzers.MaintainabilityRules.SA1413CodeFixProvider>;
714

815
public partial class SA1413CSharp12UnitTests : SA1413CSharp11UnitTests
916
{
17+
[Theory]
18+
[InlineData("1, 2")]
19+
[InlineData("1, 2,")]
20+
public async Task VerifySingleLineCollectionExpressionAsync(string elements)
21+
{
22+
var testCode = $@"
23+
namespace TestNamespace
24+
{{
25+
public class TestClass
26+
{{
27+
private int[] values = [ {elements} ];
28+
}}
29+
}}
30+
";
31+
32+
await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
33+
}
34+
35+
[Fact]
36+
public async Task VerifyMultiLineCollectionExpressionAsync()
37+
{
38+
var testCode = @"
39+
namespace TestNamespace
40+
{
41+
public class TestClass
42+
{
43+
private int[] values =
44+
[
45+
1,
46+
[|2|]
47+
];
48+
}
49+
}
50+
";
51+
52+
var fixedCode = @"
53+
namespace TestNamespace
54+
{
55+
public class TestClass
56+
{
57+
private int[] values =
58+
[
59+
1,
60+
2,
61+
];
62+
}
63+
}
64+
";
65+
66+
await VerifyCSharpFixAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, fixedCode, CancellationToken.None).ConfigureAwait(false);
67+
}
1068
}
1169
}

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp7/MaintainabilityRules/SA1413CSharp7UnitTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) Contributors to the New StyleCop Analyzers project.
22
// Licensed under the MIT License. See LICENSE in the project root for license information.
33

4-
#nullable disable
5-
64
namespace StyleCop.Analyzers.Test.CSharp7.MaintainabilityRules
75
{
86
using System.Threading;

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) Contributors to the New StyleCop Analyzers project.
22
// Licensed under the MIT License. See LICENSE in the project root for license information.
33

4-
#nullable disable
5-
64
namespace StyleCop.Analyzers.Test.CSharp8.MaintainabilityRules
75
{
86
using System.Threading;

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp9/MaintainabilityRules/SA1413CSharp9UnitTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) Contributors to the New StyleCop Analyzers project.
22
// Licensed under the MIT License. See LICENSE in the project root for license information.
33

4-
#nullable disable
5-
64
namespace StyleCop.Analyzers.Test.CSharp9.MaintainabilityRules
75
{
86
using System.Threading;

StyleCop.Analyzers/StyleCop.Analyzers.Test/MaintainabilityRules/SA1413UnitTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) Contributors to the New StyleCop Analyzers project.
22
// Licensed under the MIT License. See LICENSE in the project root for license information.
33

4-
#nullable disable
5-
64
namespace StyleCop.Analyzers.Test.MaintainabilityRules
75
{
86
using System.Threading;

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) Contributors to the New StyleCop Analyzers project.
22
// Licensed under the MIT License. See LICENSE in the project root for license information.
33

4-
#nullable disable
5-
64
namespace StyleCop.Analyzers.MaintainabilityRules
75
{
86
using System;
@@ -62,6 +60,7 @@ internal class SA1413UseTrailingCommasInMultiLineInitializers : DiagnosticAnalyz
6260
private static readonly Action<SyntaxNodeAnalysisContext> HandleAnonymousObjectInitializerAction = HandleAnonymousObjectInitializer;
6361
private static readonly Action<SyntaxNodeAnalysisContext> HandleEnumDeclarationAction = HandleEnumDeclaration;
6462
private static readonly Action<SyntaxNodeAnalysisContext> HandleSwitchExpressionAction = HandleSwitchExpression;
63+
private static readonly Action<SyntaxNodeAnalysisContext> HandleCollectionExpressionAction = HandleCollectionExpression;
6564

6665
private static readonly ImmutableArray<SyntaxKind> ObjectInitializerKinds =
6766
ImmutableArray.Create(SyntaxKind.ObjectInitializerExpression, SyntaxKind.ArrayInitializerExpression, SyntaxKind.CollectionInitializerExpression, SyntaxKindEx.WithInitializerExpression);
@@ -80,6 +79,7 @@ public override void Initialize(AnalysisContext context)
8079
context.RegisterSyntaxNodeAction(HandleAnonymousObjectInitializerAction, SyntaxKind.AnonymousObjectCreationExpression);
8180
context.RegisterSyntaxNodeAction(HandleEnumDeclarationAction, SyntaxKind.EnumDeclaration);
8281
context.RegisterSyntaxNodeAction(HandleSwitchExpressionAction, SyntaxKindEx.SwitchExpression);
82+
context.RegisterSyntaxNodeAction(HandleCollectionExpressionAction, SyntaxKindEx.CollectionExpression);
8383
}
8484

8585
private static void HandleEnumDeclaration(SyntaxNodeAnalysisContext context)
@@ -138,5 +138,19 @@ private static void HandleSwitchExpression(SyntaxNodeAnalysisContext context)
138138
context.ReportDiagnostic(Diagnostic.Create(Descriptor, switchExpression.Arms.Last().SyntaxNode.GetLocation()));
139139
}
140140
}
141+
142+
private static void HandleCollectionExpression(SyntaxNodeAnalysisContext context)
143+
{
144+
var collectionExpression = (CollectionExpressionSyntaxWrapper)context.Node;
145+
if (collectionExpression.SyntaxNode == null || !collectionExpression.SyntaxNode.SpansMultipleLines())
146+
{
147+
return;
148+
}
149+
150+
if (collectionExpression.Elements.SeparatorCount < collectionExpression.Elements.Count)
151+
{
152+
context.ReportDiagnostic(Diagnostic.Create(Descriptor, collectionExpression.Elements.Last().SyntaxNode.GetLocation()));
153+
}
154+
}
141155
}
142156
}

0 commit comments

Comments
 (0)