|
3 | 3 |
|
4 | 4 | namespace StyleCop.Analyzers.MaintainabilityRules |
5 | 5 | { |
6 | | - using System; |
7 | | - using System.Collections.Generic; |
8 | 6 | using System.Collections.Immutable; |
9 | 7 | using System.Composition; |
10 | | - using System.Linq; |
11 | 8 | using System.Threading; |
12 | 9 | using System.Threading.Tasks; |
13 | 10 | using Helpers; |
14 | 11 | using Microsoft.CodeAnalysis; |
15 | 12 | using Microsoft.CodeAnalysis.CodeActions; |
16 | 13 | using Microsoft.CodeAnalysis.CodeFixes; |
17 | | - using Microsoft.CodeAnalysis.CSharp; |
18 | | - using Microsoft.CodeAnalysis.CSharp.Syntax; |
19 | 14 | using Microsoft.CodeAnalysis.Text; |
20 | 15 |
|
21 | 16 | /// <summary> |
@@ -54,78 +49,11 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context) |
54 | 49 | private static async Task<Document> GetTransformedDocumentAsync(Document document, Diagnostic diagnostic, CancellationToken cancellationToken) |
55 | 50 | { |
56 | 51 | 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); |
58 | 54 |
|
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)); |
129 | 57 | } |
130 | 58 | } |
131 | 59 | } |
0 commit comments