Skip to content

Commit 7ddb79b

Browse files
authored
Merge pull request #2865 from sharwell/tuple-tests
Update SA1137 to handle tuple types and expressions
2 parents c14bf31 + ef096b5 commit 7ddb79b

2 files changed

Lines changed: 122 additions & 0 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp7/ReadabilityRules/SA1137CSharp7UnitTests.cs

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

44
namespace StyleCop.Analyzers.Test.CSharp7.ReadabilityRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.Testing;
69
using StyleCop.Analyzers.Test.ReadabilityRules;
10+
using Xunit;
11+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
12+
StyleCop.Analyzers.ReadabilityRules.SA1137ElementsShouldHaveTheSameIndentation,
13+
StyleCop.Analyzers.ReadabilityRules.IndentationCodeFixProvider>;
714

815
public class SA1137CSharp7UnitTests : SA1137UnitTests
916
{
17+
[Fact]
18+
public async Task TestTupleTypeAsync()
19+
{
20+
string testCode = @"
21+
class Container
22+
{
23+
(
24+
int x,
25+
int y,
26+
int z) NonZeroAlignment;
27+
28+
(
29+
int x,
30+
int y,
31+
int z) ZeroAlignment;
32+
}
33+
";
34+
string fixedCode = @"
35+
class Container
36+
{
37+
(
38+
int x,
39+
int y,
40+
int z) NonZeroAlignment;
41+
42+
(
43+
int x,
44+
int y,
45+
int z) ZeroAlignment;
46+
}
47+
";
48+
49+
DiagnosticResult[] expected =
50+
{
51+
Diagnostic().WithLocation(6, 1),
52+
Diagnostic().WithLocation(7, 1),
53+
Diagnostic().WithLocation(11, 1),
54+
Diagnostic().WithLocation(12, 1),
55+
};
56+
57+
await VerifyCSharpFixAsync(testCode, expected, fixedCode, CancellationToken.None).ConfigureAwait(false);
58+
}
59+
60+
[Fact]
61+
public async Task TestTupleExpressionAsync()
62+
{
63+
string testCode = @"
64+
class Container
65+
{
66+
(int x, int y, int z) NonZeroAlignment = (
67+
0,
68+
0,
69+
0);
70+
71+
(int x, int y, int z) ZeroAlignment = (
72+
0,
73+
0,
74+
0);
75+
}
76+
";
77+
string fixedCode = @"
78+
class Container
79+
{
80+
(int x, int y, int z) NonZeroAlignment = (
81+
0,
82+
0,
83+
0);
84+
85+
(int x, int y, int z) ZeroAlignment = (
86+
0,
87+
0,
88+
0);
89+
}
90+
";
91+
92+
DiagnosticResult[] expected =
93+
{
94+
Diagnostic().WithLocation(6, 1),
95+
Diagnostic().WithLocation(7, 1),
96+
Diagnostic().WithLocation(11, 1),
97+
Diagnostic().WithLocation(12, 1),
98+
};
99+
100+
await VerifyCSharpFixAsync(testCode, expected, fixedCode, CancellationToken.None).ConfigureAwait(false);
101+
}
10102
}
11103
}

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1137ElementsShouldHaveTheSameIndentation.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
namespace StyleCop.Analyzers.ReadabilityRules
55
{
66
using System;
7+
using System.Collections.Generic;
78
using System.Collections.Immutable;
89
using System.Linq;
910
using Microsoft.CodeAnalysis;
1011
using Microsoft.CodeAnalysis.CSharp;
1112
using Microsoft.CodeAnalysis.CSharp.Syntax;
1213
using Microsoft.CodeAnalysis.Diagnostics;
1314
using StyleCop.Analyzers.Helpers;
15+
using StyleCop.Analyzers.Lightup;
1416

1517
[DiagnosticAnalyzer(LanguageNames.CSharp)]
1618
internal class SA1137ElementsShouldHaveTheSameIndentation : DiagnosticAnalyzer
@@ -45,6 +47,8 @@ internal class SA1137ElementsShouldHaveTheSameIndentation : DiagnosticAnalyzer
4547
private static readonly Action<SyntaxNodeAnalysisContext> SwitchStatementAction = HandleSwitchStatement;
4648
private static readonly Action<SyntaxNodeAnalysisContext> InitializerExpressionAction = HandleInitializerExpression;
4749
private static readonly Action<SyntaxNodeAnalysisContext> AnonymousObjectCreationExpressionAction = HandleAnonymousObjectCreationExpression;
50+
private static readonly Action<SyntaxNodeAnalysisContext> TupleTypeAction = HandleTupleType;
51+
private static readonly Action<SyntaxNodeAnalysisContext> TupleExpressionAction = HandleTupleExpression;
4852

4953
/// <inheritdoc/>
5054
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -72,6 +76,8 @@ public override void Initialize(AnalysisContext context)
7276
context.RegisterSyntaxNodeAction(SwitchStatementAction, SyntaxKind.SwitchStatement);
7377
context.RegisterSyntaxNodeAction(InitializerExpressionAction, SyntaxKinds.InitializerExpression);
7478
context.RegisterSyntaxNodeAction(AnonymousObjectCreationExpressionAction, SyntaxKind.AnonymousObjectCreationExpression);
79+
context.RegisterSyntaxNodeAction(TupleTypeAction, SyntaxKindEx.TupleType);
80+
context.RegisterSyntaxNodeAction(TupleExpressionAction, SyntaxKindEx.TupleExpression);
7581
}
7682

7783
private static void HandleCompilationUnit(SyntaxNodeAnalysisContext context)
@@ -262,6 +268,20 @@ private static void HandleAnonymousObjectCreationExpression(SyntaxNodeAnalysisCo
262268
CheckElements(context, anonymousObjectCreationExpression.Initializers);
263269
}
264270

271+
private static void HandleTupleType(SyntaxNodeAnalysisContext context)
272+
{
273+
var tupleType = (TupleTypeSyntaxWrapper)context.Node;
274+
275+
CheckElements(context, tupleType.Elements);
276+
}
277+
278+
private static void HandleTupleExpression(SyntaxNodeAnalysisContext context)
279+
{
280+
var tupleExpression = (TupleExpressionSyntaxWrapper)context.Node;
281+
282+
CheckElements(context, tupleExpression.Arguments);
283+
}
284+
265285
private static void AddMembersAndAttributes<T>(ImmutableList<SyntaxNode>.Builder elements, SeparatedSyntaxList<T> members)
266286
where T : SyntaxNode
267287
{
@@ -355,6 +375,16 @@ private static void CheckElements<T>(SyntaxNodeAnalysisContext context, Separate
355375
CheckElements(context, elements.ToImmutableList());
356376
}
357377

378+
private static void CheckElements<T>(SyntaxNodeAnalysisContext context, SeparatedSyntaxListWrapper<T> elements)
379+
{
380+
if (elements.Count < 2)
381+
{
382+
return;
383+
}
384+
385+
CheckElements(context, ((IEnumerable<SyntaxNode>)elements.UnderlyingList).ToImmutableList());
386+
}
387+
358388
// BlockSyntax is analyzed separately because it needs to check both braces.
359389
private static void CheckBlocks(SyntaxNodeAnalysisContext context, ImmutableList<BlockSyntax> elements)
360390
{

0 commit comments

Comments
 (0)