|
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; |
| 14 | + using Microsoft.CodeAnalysis.Text; |
19 | 15 |
|
20 | 16 | /// <summary> |
21 | 17 | /// Implements a code fix for <see cref="SA1413UseTrailingCommasInMultiLineInitializers"/>. |
@@ -53,67 +49,11 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context) |
53 | 49 | private static async Task<Document> GetTransformedDocumentAsync(Document document, Diagnostic diagnostic, CancellationToken cancellationToken) |
54 | 50 | { |
55 | 51 | var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); |
56 | | - 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); |
57 | 54 |
|
58 | | - SyntaxNode newParent = null; |
59 | | - switch (parent.Kind()) |
60 | | - { |
61 | | - case SyntaxKind.ObjectInitializerExpression: |
62 | | - case SyntaxKind.ArrayInitializerExpression: |
63 | | - case SyntaxKind.CollectionInitializerExpression: |
64 | | - newParent = RewriteInitializer((InitializerExpressionSyntax)parent); |
65 | | - break; |
66 | | - |
67 | | - case SyntaxKind.AnonymousObjectCreationExpression: |
68 | | - newParent = RewriteAnonymousObjectInitializer((AnonymousObjectCreationExpressionSyntax)parent); |
69 | | - break; |
70 | | - |
71 | | - default: |
72 | | - throw new InvalidOperationException("Unknown initializer type: " + parent.Kind()); |
73 | | - } |
74 | | - |
75 | | - var newSyntaxRoot = syntaxRoot.ReplaceNode(parent, newParent); |
76 | | - |
77 | | - var newDocument = document.WithSyntaxRoot(newSyntaxRoot.WithoutFormatting()); |
78 | | - return newDocument; |
79 | | - } |
80 | | - |
81 | | - private static SyntaxNode RewriteInitializer(InitializerExpressionSyntax initializer) |
82 | | - { |
83 | | - var existingItems = new List<ExpressionSyntax>(initializer.Expressions); |
84 | | - var last = existingItems.Last(); |
85 | | - existingItems.Remove(last); |
86 | | - existingItems.Add(last.WithoutTrailingTrivia()); |
87 | | - |
88 | | - var existingSeparators = initializer.Expressions.GetSeparators(); |
89 | | - var newSeparators = new List<SyntaxToken>(existingSeparators); |
90 | | - newSeparators.Add(SyntaxFactory.Token(SyntaxKind.CommaToken).WithTrailingTrivia(last.GetTrailingTrivia())); |
91 | | - |
92 | | - var newInitializerExpressions = SyntaxFactory.SeparatedList( |
93 | | - existingItems, |
94 | | - newSeparators); |
95 | | - |
96 | | - var fixedInitializer = initializer.WithExpressions(newInitializerExpressions); |
97 | | - return fixedInitializer; |
98 | | - } |
99 | | - |
100 | | - private static SyntaxNode RewriteAnonymousObjectInitializer(AnonymousObjectCreationExpressionSyntax initializer) |
101 | | - { |
102 | | - var existingItems = new List<AnonymousObjectMemberDeclaratorSyntax>(initializer.Initializers); |
103 | | - var last = existingItems.Last(); |
104 | | - existingItems.Remove(last); |
105 | | - existingItems.Add(last.WithoutTrailingTrivia()); |
106 | | - |
107 | | - var existingSeparators = initializer.Initializers.GetSeparators(); |
108 | | - var newSeparators = new List<SyntaxToken>(existingSeparators); |
109 | | - newSeparators.Add(SyntaxFactory.Token(SyntaxKind.CommaToken).WithTrailingTrivia(last.GetTrailingTrivia())); |
110 | | - |
111 | | - var newInitializerExpressions = SyntaxFactory.SeparatedList( |
112 | | - existingItems, |
113 | | - newSeparators); |
114 | | - |
115 | | - var fixedInitializer = initializer.WithInitializers(newInitializerExpressions); |
116 | | - return fixedInitializer; |
| 55 | + TextChange textChange = new TextChange(diagnostic.Location.SourceSpan, syntaxNode.ToString() + ","); |
| 56 | + return document.WithText(text.WithChanges(textChange)); |
117 | 57 | } |
118 | 58 | } |
119 | 59 | } |
0 commit comments