1using System.Collections.Immutable;
2using System.Composition;
4using System.Threading.Tasks;
14 [ExportCodeFixProvider(LanguageNames.CSharp)]
19 public override ImmutableArray<string>
FixableDiagnosticIds => ImmutableArray.Create(Constants.AnalyzerIdentifiers.FindSaveAsyncAssignmentIssue);
21 public sealed
override FixAllProvider
GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
25 var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(
false);
27 context.CancellationToken.ThrowIfCancellationRequested();
29 var diagnostic = context.Diagnostics.First();
30 var invocationNode = root.FindNode(diagnostic.Location.SourceSpan) as InvocationExpressionSyntax;
32 var awaitExpressionNode = invocationNode.FindParent<AwaitExpressionSyntax>();
34 if(awaitExpressionNode !=
null)
36 var awaitKeyword = awaitExpressionNode.AwaitKeyword;
37 var leadingTrivia = awaitKeyword.HasLeadingTrivia ?
38 awaitKeyword.LeadingTrivia :
new SyntaxTriviaList();
40 var newAwaitExpressionNode = awaitExpressionNode.WithAwaitKeyword(
41 awaitKeyword.WithLeadingTrivia(
new SyntaxTriviaList()));
42 var invocationIdentifier = ((invocationNode.Expression as MemberAccessExpressionSyntax)
43 .Expression as IdentifierNameSyntax).Identifier;
44 var newInvocationIdentifier = invocationIdentifier.WithLeadingTrivia(
new SyntaxTriviaList());
46 context.CancellationToken.ThrowIfCancellationRequested();
48 var simpleAssignmentExpressionNode = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression,
49 SyntaxFactory.IdentifierName(newInvocationIdentifier), newAwaitExpressionNode)
50 .WithLeadingTrivia(leadingTrivia);
52 var newRoot = root.ReplaceNode(awaitExpressionNode, simpleAssignmentExpressionNode);
54 context.RegisterCodeFix(
56 FindSaveAssignmentIssueAnalyzerAddAsyncAssignmentCodeFixConstants.AddAssignmentDescription,
57 _ => Task.FromResult(context.Document.WithSyntaxRoot(newRoot)),
58 FindSaveAssignmentIssueAnalyzerAddAsyncAssignmentCodeFixConstants.AddAssignmentDescription), diagnostic);
sealed override FixAllProvider GetFixAllProvider()
override ImmutableArray< string > FixableDiagnosticIds
override async Task RegisterCodeFixesAsync(CodeFixContext context)