|
4 | 4 | namespace StyleCop.Analyzers.ReadabilityRules |
5 | 5 | { |
6 | 6 | using System; |
| 7 | + using System.Collections.Generic; |
7 | 8 | using System.Collections.Immutable; |
8 | 9 | using System.Linq; |
9 | 10 | using Microsoft.CodeAnalysis; |
10 | 11 | using Microsoft.CodeAnalysis.CSharp; |
11 | 12 | using Microsoft.CodeAnalysis.CSharp.Syntax; |
12 | 13 | using Microsoft.CodeAnalysis.Diagnostics; |
13 | 14 | using StyleCop.Analyzers.Helpers; |
| 15 | + using StyleCop.Analyzers.Lightup; |
14 | 16 |
|
15 | 17 | [DiagnosticAnalyzer(LanguageNames.CSharp)] |
16 | 18 | internal class SA1137ElementsShouldHaveTheSameIndentation : DiagnosticAnalyzer |
@@ -45,6 +47,8 @@ internal class SA1137ElementsShouldHaveTheSameIndentation : DiagnosticAnalyzer |
45 | 47 | private static readonly Action<SyntaxNodeAnalysisContext> SwitchStatementAction = HandleSwitchStatement; |
46 | 48 | private static readonly Action<SyntaxNodeAnalysisContext> InitializerExpressionAction = HandleInitializerExpression; |
47 | 49 | private static readonly Action<SyntaxNodeAnalysisContext> AnonymousObjectCreationExpressionAction = HandleAnonymousObjectCreationExpression; |
| 50 | + private static readonly Action<SyntaxNodeAnalysisContext> TupleTypeAction = HandleTupleType; |
| 51 | + private static readonly Action<SyntaxNodeAnalysisContext> TupleExpressionAction = HandleTupleExpression; |
48 | 52 |
|
49 | 53 | /// <inheritdoc/> |
50 | 54 | public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = |
@@ -72,6 +76,8 @@ public override void Initialize(AnalysisContext context) |
72 | 76 | context.RegisterSyntaxNodeAction(SwitchStatementAction, SyntaxKind.SwitchStatement); |
73 | 77 | context.RegisterSyntaxNodeAction(InitializerExpressionAction, SyntaxKinds.InitializerExpression); |
74 | 78 | context.RegisterSyntaxNodeAction(AnonymousObjectCreationExpressionAction, SyntaxKind.AnonymousObjectCreationExpression); |
| 79 | + context.RegisterSyntaxNodeAction(TupleTypeAction, SyntaxKindEx.TupleType); |
| 80 | + context.RegisterSyntaxNodeAction(TupleExpressionAction, SyntaxKindEx.TupleExpression); |
75 | 81 | } |
76 | 82 |
|
77 | 83 | private static void HandleCompilationUnit(SyntaxNodeAnalysisContext context) |
@@ -262,6 +268,20 @@ private static void HandleAnonymousObjectCreationExpression(SyntaxNodeAnalysisCo |
262 | 268 | CheckElements(context, anonymousObjectCreationExpression.Initializers); |
263 | 269 | } |
264 | 270 |
|
| 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 | + |
265 | 285 | private static void AddMembersAndAttributes<T>(ImmutableList<SyntaxNode>.Builder elements, SeparatedSyntaxList<T> members) |
266 | 286 | where T : SyntaxNode |
267 | 287 | { |
@@ -355,6 +375,16 @@ private static void CheckElements<T>(SyntaxNodeAnalysisContext context, Separate |
355 | 375 | CheckElements(context, elements.ToImmutableList()); |
356 | 376 | } |
357 | 377 |
|
| 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 | + |
358 | 388 | // BlockSyntax is analyzed separately because it needs to check both braces. |
359 | 389 | private static void CheckBlocks(SyntaxNodeAnalysisContext context, ImmutableList<BlockSyntax> elements) |
360 | 390 | { |
|
0 commit comments