33
44namespace 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