CSLA.NET 6.0.0
CSLA .NET is a software development framework that helps you build a reusable, maintainable object-oriented business layer for your app.
FindSaveAssignmentIssueAnalyzerAddAsyncAssignmentCodeFix.cs
Go to the documentation of this file.
1using System.Collections.Immutable;
2using System.Composition;
3using System.Linq;
4using System.Threading.Tasks;
5using Microsoft.CodeAnalysis;
6using Microsoft.CodeAnalysis.CodeFixes;
7using Microsoft.CodeAnalysis.CSharp.Syntax;
8using Microsoft.CodeAnalysis.CSharp;
9using Microsoft.CodeAnalysis.CodeActions;
11
12namespace Csla.Analyzers
13{
14 [ExportCodeFixProvider(LanguageNames.CSharp)]
15 [Shared]
17 : CodeFixProvider
18 {
19 public override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(Constants.AnalyzerIdentifiers.FindSaveAsyncAssignmentIssue);
20
21 public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
22
23 public override async Task RegisterCodeFixesAsync(CodeFixContext context)
24 {
25 var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
26
27 context.CancellationToken.ThrowIfCancellationRequested();
28
29 var diagnostic = context.Diagnostics.First();
30 var invocationNode = root.FindNode(diagnostic.Location.SourceSpan) as InvocationExpressionSyntax;
31
32 var awaitExpressionNode = invocationNode.FindParent<AwaitExpressionSyntax>();
33
34 if(awaitExpressionNode != null)
35 {
36 var awaitKeyword = awaitExpressionNode.AwaitKeyword;
37 var leadingTrivia = awaitKeyword.HasLeadingTrivia ?
38 awaitKeyword.LeadingTrivia : new SyntaxTriviaList();
39
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());
45
46 context.CancellationToken.ThrowIfCancellationRequested();
47
48 var simpleAssignmentExpressionNode = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression,
49 SyntaxFactory.IdentifierName(newInvocationIdentifier), newAwaitExpressionNode)
50 .WithLeadingTrivia(leadingTrivia);
51
52 var newRoot = root.ReplaceNode(awaitExpressionNode, simpleAssignmentExpressionNode);
53
54 context.RegisterCodeFix(
55 CodeAction.Create(
56 FindSaveAssignmentIssueAnalyzerAddAsyncAssignmentCodeFixConstants.AddAssignmentDescription,
57 _ => Task.FromResult(context.Document.WithSyntaxRoot(newRoot)),
58 FindSaveAssignmentIssueAnalyzerAddAsyncAssignmentCodeFixConstants.AddAssignmentDescription), diagnostic);
59 }
60 }
61 }
62}