Skip to content

Commit cba5de1

Browse files
committed
SA1132: added handling of trailing trivia and fixed spacing issue
1 parent b141a47 commit cba5de1

1 file changed

Lines changed: 56 additions & 34 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1132CodeFixProvider.cs

Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace StyleCop.Analyzers.ReadabilityRules
55
{
6+
using System;
67
using System.Collections.Generic;
78
using System.Collections.Immutable;
89
using System.Composition;
@@ -57,7 +58,7 @@ private static async Task<Document> GetTransformedDocumentAsync(Document documen
5758
{
5859
var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
5960
var baseFieldDeclaration = (BaseFieldDeclarationSyntax)syntaxRoot.FindNode(diagnostic.Location.SourceSpan);
60-
List<BaseFieldDeclarationSyntax> newFieldDeclarations = SplitDeclaration(baseFieldDeclaration);
61+
List<BaseFieldDeclarationSyntax> newFieldDeclarations = SplitDeclaration(document, baseFieldDeclaration);
6162

6263
if (newFieldDeclarations != null)
6364
{
@@ -70,59 +71,80 @@ private static async Task<Document> GetTransformedDocumentAsync(Document documen
7071
return document;
7172
}
7273

73-
private static List<BaseFieldDeclarationSyntax> SplitDeclaration(BaseFieldDeclarationSyntax baseFieldDeclaration)
74+
private static List<BaseFieldDeclarationSyntax> SplitDeclaration(Document document, BaseFieldDeclarationSyntax baseFieldDeclaration)
7475
{
7576
var fieldDeclaration = baseFieldDeclaration as FieldDeclarationSyntax;
7677
if (fieldDeclaration != null)
7778
{
78-
VariableDeclarationSyntax declaration = fieldDeclaration.Declaration;
79-
SeparatedSyntaxList<VariableDeclaratorSyntax> variables = declaration.Variables;
80-
VariableDeclaratorSyntax first = variables.First();
81-
var newFieldDeclarations = new List<BaseFieldDeclarationSyntax>(variables.Count);
82-
83-
foreach (VariableDeclaratorSyntax variable in variables)
84-
{
85-
var variableDeclarator = SyntaxFactory.SingletonSeparatedList(variable);
86-
var newFieldDeclaration = fieldDeclaration.WithDeclaration(declaration.WithVariables(variableDeclarator));
87-
88-
if (variable != first)
89-
{
90-
var triviaList = newFieldDeclaration.GetLeadingTrivia().WithoutDirectiveTrivia();
91-
newFieldDeclaration = newFieldDeclaration.WithLeadingTrivia(triviaList);
92-
}
93-
94-
newFieldDeclarations.Add(newFieldDeclaration);
95-
}
96-
97-
return newFieldDeclarations;
79+
return DeclarationSplitter(
80+
document,
81+
fieldDeclaration.Declaration,
82+
fieldDeclaration.WithDeclaration,
83+
fieldDeclaration.SemicolonToken.TrailingTrivia);
9884
}
9985

10086
var eventFieldDeclaration = baseFieldDeclaration as EventFieldDeclarationSyntax;
10187
if (eventFieldDeclaration != null)
10288
{
103-
VariableDeclarationSyntax declaration = eventFieldDeclaration.Declaration;
104-
SeparatedSyntaxList<VariableDeclaratorSyntax> variables = declaration.Variables;
105-
var first = variables.First();
106-
var newEventFieldDeclarations = new List<BaseFieldDeclarationSyntax>(variables.Count);
89+
return DeclarationSplitter(
90+
document,
91+
eventFieldDeclaration.Declaration,
92+
eventFieldDeclaration.WithDeclaration,
93+
eventFieldDeclaration.SemicolonToken.TrailingTrivia);
94+
}
10795

108-
foreach (VariableDeclaratorSyntax variable in variables)
96+
return null;
97+
}
98+
99+
private static List<BaseFieldDeclarationSyntax> DeclarationSplitter(
100+
Document document,
101+
VariableDeclarationSyntax declaration,
102+
Func<VariableDeclarationSyntax, BaseFieldDeclarationSyntax> declarationFactory,
103+
SyntaxTriviaList declarationTrailingTrivia)
104+
{
105+
SeparatedSyntaxList<VariableDeclaratorSyntax> variables = declaration.Variables;
106+
VariableDeclaratorSyntax first = variables.First();
107+
BaseFieldDeclarationSyntax previous = null;
108+
var newFieldDeclarations = new List<BaseFieldDeclarationSyntax>(variables.Count);
109+
110+
foreach (SyntaxNodeOrToken nodeOrToken in variables.GetWithSeparators())
111+
{
112+
if (previous == null)
109113
{
114+
VariableDeclaratorSyntax variable = (VariableDeclaratorSyntax)nodeOrToken.AsNode();
115+
variable = variable.WithIdentifier(variable.Identifier.WithoutLeadingWhitespace());
110116
var variableDeclarator = SyntaxFactory.SingletonSeparatedList(variable);
111-
var newEventFieldDeclaration = eventFieldDeclaration.WithDeclaration(declaration.WithVariables(variableDeclarator));
117+
previous = declarationFactory(declaration.WithVariables(variableDeclarator));
112118

113119
if (variable != first)
114120
{
115-
var triviaList = newEventFieldDeclaration.GetLeadingTrivia().WithoutDirectiveTrivia();
116-
newEventFieldDeclaration = newEventFieldDeclaration.WithLeadingTrivia(triviaList);
121+
var triviaList = previous.GetLeadingTrivia().WithoutDirectiveTrivia();
122+
previous = previous.WithLeadingTrivia(triviaList);
117123
}
118-
119-
newEventFieldDeclarations.Add(newEventFieldDeclaration);
120124
}
125+
else
126+
{
127+
SyntaxToken commaToken = nodeOrToken.AsToken();
128+
SyntaxTriviaList trailingTrivia = commaToken.TrailingTrivia;
129+
if (trailingTrivia.Any())
130+
{
131+
if (!trailingTrivia.Last().IsKind(SyntaxKind.EndOfLineTrivia))
132+
{
133+
trailingTrivia = trailingTrivia.WithoutTrailingWhitespace().Add(TriviaHelper.GetNewLineTrivia(document));
134+
}
135+
}
136+
else
137+
{
138+
trailingTrivia = SyntaxTriviaList.Create(TriviaHelper.GetNewLineTrivia(document));
139+
}
121140

122-
return newEventFieldDeclarations;
141+
newFieldDeclarations.Add(previous.WithTrailingTrivia(trailingTrivia));
142+
previous = null;
143+
}
123144
}
124145

125-
return null;
146+
newFieldDeclarations.Add(previous.WithTrailingTrivia(declarationTrailingTrivia));
147+
return newFieldDeclarations;
126148
}
127149
}
128150
}

0 commit comments

Comments
 (0)