-
-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathCodeFixProviderBase.cs
More file actions
48 lines (39 loc) · 1.95 KB
/
Copy pathCodeFixProviderBase.cs
File metadata and controls
48 lines (39 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Operations;
using CreateChangedDocument = System.Func<System.Threading.CancellationToken, System.Threading.Tasks.Task<Microsoft.CodeAnalysis.Document>>;
namespace FluentAssertions.Analyzers;
public abstract class CodeFixProviderBase<TTestContext> : CodeFixProvider where TTestContext : class
{
public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
protected abstract string Title { get; }
public override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken);
var semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken);
var testContext = CreateTestContext(semanticModel);
foreach (var diagnostic in context.Diagnostics)
{
var node = root.FindNode(diagnostic.Location.SourceSpan);
if (node is not InvocationExpressionSyntax invocationExpression)
{
continue;
}
var operation = semanticModel.GetOperation(invocationExpression, context.CancellationToken);
if (operation is not IInvocationOperation invocation)
{
continue;
}
var fix = TryComputeFix(invocation, context, testContext, diagnostic);
if (fix is not null)
{
context.RegisterCodeFix(CodeAction.Create(Title, fix, equivalenceKey: Title), diagnostic);
}
}
}
protected abstract TTestContext CreateTestContext(SemanticModel semanticModel);
protected abstract CreateChangedDocument TryComputeFix(IInvocationOperation invocation, CodeFixContext context, TTestContext t, Diagnostic diagnostic);
}