/// <summary> /// Returns a <see cref="CodeAction"/> to be executed. /// </summary> /// <param name="data">Represents data that is used when creating a <see cref="CodeAction"/> for the code fix.</param> protected virtual async Task <CodeAction?> GetCodeActionAsync(CodeFixData <T> data) { if (!data.Success || !data.HasNode) { return(null); } Document document = data.Document; T node = data.Node; CompilationUnitSyntax root = data.Root; Diagnostic diagnostic = data.Diagnostic; SemanticModel? semanticModel = data.SemanticModel ?? await document.GetSemanticModelAsync(data.CancellationToken).ConfigureAwait(false); if (semanticModel is null) { return(null); } return(CodeAction.Create(Title, cancellationToken => ExecuteAsync(CodeFixExecutionContext <T> .From( diagnostic, document, root, node, semanticModel, cancellationToken)), Id)); }
/// <inheritdoc/> protected override Task <Document> ExecuteAsync(CodeFixExecutionContext <T> context) { MemberDeclarationSyntax newNode = context.Node.AddModifiers(ModifiersToApply.Select(m => SyntaxFactory.Token(m)).ToArray()); context.RegisterChange(context.Node, newNode); return(Task.FromResult(context.Document)); }
/// <inheritdoc/> protected override Task <Document> ExecuteAsync(CodeFixExecutionContext <T> context) { SyntaxNode?newRoot = context.Root.RemoveNode(context.Node, SyntaxRemoveOptions.KeepEndOfLine | SyntaxRemoveOptions.KeepDirectives); if (newRoot is null) { return(Task.FromResult(context.Document)); } return(Task.FromResult(context.Document.WithSyntaxRoot(newRoot))); }
/// <summary> /// Actually executes the <see cref="CodeAction"/>. /// </summary> /// <param name="context"><see cref="CodeFixExecutionContext{T}"/> that contains all the data needed to properly perform a code fix.</param> protected abstract Task <Document> ExecuteAsync(CodeFixExecutionContext <T> context);