Skip to content

Commit 763906e

Browse files
author
Dirk Lemstra
committed
Changes due to review comments.
1 parent b0e5f48 commit 763906e

3 files changed

Lines changed: 7 additions & 80 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/MaintainabilityRules/SA1413CodeFixProvider.cs

Lines changed: 4 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,14 @@
33

44
namespace StyleCop.Analyzers.MaintainabilityRules
55
{
6-
using System;
7-
using System.Collections.Generic;
86
using System.Collections.Immutable;
97
using System.Composition;
10-
using System.Linq;
118
using System.Threading;
129
using System.Threading.Tasks;
1310
using Helpers;
1411
using Microsoft.CodeAnalysis;
1512
using Microsoft.CodeAnalysis.CodeActions;
1613
using Microsoft.CodeAnalysis.CodeFixes;
17-
using Microsoft.CodeAnalysis.CSharp;
18-
using Microsoft.CodeAnalysis.CSharp.Syntax;
1914
using Microsoft.CodeAnalysis.Text;
2015

2116
/// <summary>
@@ -54,78 +49,11 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
5449
private static async Task<Document> GetTransformedDocumentAsync(Document document, Diagnostic diagnostic, CancellationToken cancellationToken)
5550
{
5651
var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
57-
var parent = syntaxRoot.FindNode(diagnostic.Location.SourceSpan).Parent;
52+
var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
53+
var syntaxNode = syntaxRoot.FindNode(diagnostic.Location.SourceSpan);
5854

59-
SyntaxNode newParent = null;
60-
switch (parent.Kind())
61-
{
62-
case SyntaxKind.ObjectInitializerExpression:
63-
case SyntaxKind.ArrayInitializerExpression:
64-
case SyntaxKind.CollectionInitializerExpression:
65-
newParent = RewriteInitializer((InitializerExpressionSyntax)parent);
66-
break;
67-
68-
case SyntaxKind.AnonymousObjectCreationExpression:
69-
newParent = RewriteAnonymousObjectInitializer((AnonymousObjectCreationExpressionSyntax)parent);
70-
break;
71-
72-
case SyntaxKind.EnumDeclaration:
73-
var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
74-
TextChange textChange = GetEnumMemberTextChange(diagnostic, syntaxRoot);
75-
return document.WithText(text.WithChanges(textChange));
76-
77-
default:
78-
throw new InvalidOperationException("Unknown initializer type: " + parent.Kind());
79-
}
80-
81-
var newSyntaxRoot = syntaxRoot.ReplaceNode(parent, newParent);
82-
83-
var newDocument = document.WithSyntaxRoot(newSyntaxRoot.WithoutFormatting());
84-
return newDocument;
85-
}
86-
87-
private static SyntaxNode RewriteInitializer(InitializerExpressionSyntax initializer)
88-
{
89-
var existingItems = new List<ExpressionSyntax>(initializer.Expressions);
90-
var last = existingItems.Last();
91-
existingItems.Remove(last);
92-
existingItems.Add(last.WithoutTrailingTrivia());
93-
94-
var existingSeparators = initializer.Expressions.GetSeparators();
95-
var newSeparators = new List<SyntaxToken>(existingSeparators);
96-
newSeparators.Add(SyntaxFactory.Token(SyntaxKind.CommaToken).WithTrailingTrivia(last.GetTrailingTrivia()));
97-
98-
var newInitializerExpressions = SyntaxFactory.SeparatedList(
99-
existingItems,
100-
newSeparators);
101-
102-
var fixedInitializer = initializer.WithExpressions(newInitializerExpressions);
103-
return fixedInitializer;
104-
}
105-
106-
private static SyntaxNode RewriteAnonymousObjectInitializer(AnonymousObjectCreationExpressionSyntax initializer)
107-
{
108-
var existingItems = new List<AnonymousObjectMemberDeclaratorSyntax>(initializer.Initializers);
109-
var last = existingItems.Last();
110-
existingItems.Remove(last);
111-
existingItems.Add(last.WithoutTrailingTrivia());
112-
113-
var existingSeparators = initializer.Initializers.GetSeparators();
114-
var newSeparators = new List<SyntaxToken>(existingSeparators);
115-
newSeparators.Add(SyntaxFactory.Token(SyntaxKind.CommaToken).WithTrailingTrivia(last.GetTrailingTrivia()));
116-
117-
var newInitializerExpressions = SyntaxFactory.SeparatedList(
118-
existingItems,
119-
newSeparators);
120-
121-
var fixedInitializer = initializer.WithInitializers(newInitializerExpressions);
122-
return fixedInitializer;
123-
}
124-
125-
private static TextChange GetEnumMemberTextChange(Diagnostic diagnostic, SyntaxNode syntaxRoot)
126-
{
127-
var member = (EnumMemberDeclarationSyntax)syntaxRoot.FindNode(diagnostic.Location.SourceSpan);
128-
return new TextChange(diagnostic.Location.SourceSpan, member.ToString() + ",");
55+
TextChange textChange = new TextChange(diagnostic.Location.SourceSpan, syntaxNode.ToString() + ",");
56+
return document.WithText(text.WithChanges(textChange));
12957
}
13058
}
13159
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,13 +497,13 @@ public async Task VerifyEnumWithValueWithoutTrailingCommaAsync()
497497
{
498498
var testCode = @"enum TestEnum
499499
{
500-
One = 2
500+
One = 2 /* test comment */
501501
}
502502
";
503503

504504
var fixedTestCode = @"enum TestEnum
505505
{
506-
One = 2,
506+
One = 2, /* test comment */
507507
}
508508
";
509509

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,7 @@ private static void HandleEnumMemberDeclarationAction(SyntaxNodeAnalysisContext
8686
return;
8787
}
8888

89-
var commas = initializer.ChildNodesAndTokens().OfType<SyntaxNodeOrToken>().Where(token => token.IsKind(SyntaxKind.CommaToken));
90-
if (initializer.Members.Count() != commas.Count())
89+
if (initializer.Members.Count() != initializer.Members.SeparatorCount)
9190
{
9291
context.ReportDiagnostic(Diagnostic.Create(Descriptor, lastMember.GetLocation()));
9392
}

0 commit comments

Comments
 (0)