[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(RemoveUnusedVariableCodeFixProvider)), Shared] public class RemoveUnusedVariableCodeFixProvider : CodeFixProvider { public override ImmutableArrayFixableDiagnosticIds => ImmutableArray.Create(DiagnosticIds.UnusedVariable); public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; public async override Task RegisterCodeFixesAsync(CodeFixContext context) { var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); var diagnostic = context.Diagnostics.First(); var node = root.FindNode(diagnostic.Location.SourceSpan); if (node is VariableDeclaratorSyntax variable && variable.Identifier.ValueText == diagnostic.Properties["identifier"]) { var identifierPosition = variable.Identifier.GetLocation(); var identifierToken = SyntaxFactory.IdentifierToken("_"); var newRoot = root.ReplaceToken(variable.Identifier, identifierToken); var newDocument = context.Document.WithSyntaxRoot(newRoot); context.RegisterCodeFix( CodeAction.Create("Remove unused variable", ct => Task.FromResult(newDocument), nameof(RemoveUnusedVariableCodeFixProvider)), diagnostic); } } }
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(ReplaceBadCharactersCodeFixProvider)), Shared] public class ReplaceBadCharactersCodeFixProvider : CodeFixProvider { public override ImmutableArrayOverall, the Microsoft.CodeAnalysis.CodeFixes package is a powerful tool for implementing automatic code fix providers in C#. By using CodeFixContext, developers can easily access information about the location and type of the issues that need to be fixed and implement custom logic to correct those issues.FixableDiagnosticIds => ImmutableArray.Create(DiagnosticIds.BadCharacters); public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; public async override Task RegisterCodeFixesAsync(CodeFixContext context) { var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); var diagnostic = context.Diagnostics.First(); var node = root.FindNode(diagnostic.Location.SourceSpan); if (node is IdentifierNameSyntax identifier) { var newName = new string(identifier.Identifier.ValueText.Where(c => char.IsLetterOrDigit(c) || c == '_').ToArray()); var newIdentifier = SyntaxFactory.Identifier(newName).WithTriviaFrom(identifier.Identifier); var newRoot = root.ReplaceNode(identifier.Identifier, newIdentifier); var newDocument = context.Document.WithSyntaxRoot(newRoot); context.RegisterCodeFix( CodeAction.Create("Replace bad characters", ct => Task.FromResult(newDocument), nameof(ReplaceBadCharactersCodeFixProvider)), diagnostic); } } }