Einführung in den Roslyn CodeFixProvider

Einführung in den Roslyn CodeFixProvider

23. Sept. 2024 | Gregor Koletzki | 3 Min. Lesezeit

Roslyn, Microsofts .NET Compiler Platform, bietet nicht nur die Möglichkeit, Quellcode zu analysieren und zu kompilieren, sondern auch, ihn dynamisch zu verändern. Eine der leistungsfähigsten Funktionen, die Roslyn bietet, ist die Möglichkeit, eigene Code-Analysetools und automatische Korrekturen zu schreiben. Dabei spielt der CodeFixProvider eine zentrale Rolle. In diesem Artikel erforschen wir, was ein CodeFixProvider ist, wie er funktioniert und wie man einen eigenen schreibt.

Was ist der CodeFixProvider?

Ein CodeFixProvider ist ein Teil von Roslyns API, der Entwicklern erlaubt, automatische Korrekturen für bestimmte Codeprobleme anzubieten. Er arbeitet eng mit einem DiagnosticAnalyzer zusammen, welcher den Code analysiert und Diagnosen erstellt. Sobald eine Diagnose erstellt wird, kann der CodeFixProvider dem Benutzer vorschlagen, den Fehler automatisch zu beheben.

Typische Anwendungsfälle umfassen:

  • Syntaxfehlerkorrektur: Vorschläge zur Korrektur von Syntaxfehlern oder Stilproblemen.
  • Refactorings: Vorschläge zur Umstrukturierung von Code, um bessere Lesbarkeit oder Performance zu erzielen.
  • Fehlerbehebung: Automatische Fixes für erkannte Probleme wie Nullverweise, falsche Typverwendungen, etc.

Wie funktioniert ein CodeFixProvider?

Der CodeFixProvider überwacht Diagnosen, die von einem DiagnosticAnalyzer erstellt wurden. Wenn eine Diagnose gefunden wird, die einem spezifischen Problem entspricht, bietet der CodeFixProvider eine oder mehrere mögliche Korrekturen an. Diese Korrekturen können dann vom Entwickler direkt im IDE, wie Visual Studio, angewendet werden.

Die wichtigsten Schritte in der Funktionsweise eines CodeFixProviders sind:

  1. Registrierung des CodeFixProviders: Der CodeFixProvider wird mit einem oder mehreren Diagnosetypen verknüpft, die er beheben kann.
  2. Erstellung einer Codefix-Aktion: Der CodeFixProvider definiert die Art der Korrektur und wie der Quellcode entsprechend geändert werden soll.
  3. Anwenden der Korrektur: Wenn der Entwickler den Vorschlag akzeptiert, wird die Korrektur auf den Code angewendet.

Aufbau eines einfachen CodeFixProviders

  1. Erstellen des Projekts Zuerst wird ein neues Roslyn Analyzer-Projekt benötigt. Dies kann in Visual Studio mit der Vorlage Analyzer with Code Fix erstellt werden.

  2. Implementieren des CodeFixProviders Ein CodeFixProvider ist eine Klasse, die von CodeFixProvider erbt und die Methode RegisterCodeFixesAsync überschreibt. Hier wird die Logik für den Fix implementiert. Der grundlegende Aufbau sieht folgendermaßen aus:

[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(MyCodeFixProvider)), Shared]
public class MyCodeFixProvider : CodeFixProvider
{
    public sealed override ImmutableArray<string> FixableDiagnosticIds
        => ImmutableArray.Create(MyAnalyzer.DiagnosticId);

    public sealed override FixAllProvider GetFixAllProvider()
        => WellKnownFixAllProviders.BatchFixer;

    public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
    {
        var diagnostic = context.Diagnostics.First();
        var diagnosticSpan = diagnostic.Location.SourceSpan;

        // Find the syntax node that needs to be fixed
        var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
        var node = root.FindNode(diagnosticSpan);

        // Register a code fix action
        context.RegisterCodeFix(
            CodeAction.Create(
                title: "Fix this issue",
                createChangedDocument: c => FixCodeAsync(context.Document, node, c),
                equivalenceKey: "Fix this issue"),
            diagnostic);
    }

    private async Task<Document> FixCodeAsync(Document document, SyntaxNode node, CancellationToken cancellationToken)
    {
        // TODO: Implement code fix logic here
        var newRoot = // Apply changes to the root here
        return document.WithSyntaxRoot(newRoot);
    }
}
  1. Analyse und Code Fix Verknüpfung Der CodeFixProvider ist immer mit einer Diagnose verknüpft. Diese Diagnose stammt aus einem DiagnosticAnalyzer. Zum Beispiel könnte ein Analyzer eine Diagnose für Methoden bereitstellen, deren Namen nicht den Konventionen entsprechen (z.B. beginnen nicht mit einem Großbuchstaben). Der CodeFixProvider könnte dann die Namenskonvention automatisch korrigieren, indem er den Methodennamen in den entsprechenden Syntaxbaumknoten ändert.

  2. Bereitstellen einer Code-Fix-Aktion Innerhalb von RegisterCodeFixesAsync wird eine CodeAction registriert. Diese repräsentiert die eigentliche Fix-Operation, die der Entwickler anwenden kann. Die CodeAction besteht aus:

    • Title: Der Name des Fixes, der dem Benutzer angezeigt wird.
    • createChangedDocument: Eine Funktion, die den veränderten Code zurückgibt.
    • equivalenceKey: Ein Schlüssel zur Unterscheidung mehrerer Korrekturen.
  3. Anwenden des Fixes Die Funktion FixCodeAsync führt die tatsächliche Änderung im Syntaxbaum durch. Roslyn verwendet einen unveränderlichen Syntaxbaum, das bedeutet, dass Änderungen am Code durch das Erstellen eines neuen Syntaxbaums geschehen, nicht durch direkte Modifikation. Der neue Syntaxbaum wird dann in das Dokument übernommen.

Beispiel: Fix für ein fehlendes using-Statement

Angenommen, der Analyzer erkennt, dass eine Klasse verwendet wird, aber das entsprechende using-Statement fehlt. Der CodeFixProvider könnte automatisch das fehlende using-Statement hinzufügen.

private async Task<Document> FixCodeAsync(Document document, SyntaxNode node, CancellationToken cancellationToken)
{
    var root = await document.GetSyntaxRootAsync(cancellationToken);
    var newUsing = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName("System"));

    var newRoot = root.AddUsings(newUsing);
    return document.WithSyntaxRoot(newRoot);
}

In diesem Beispiel wird ein neues using System zur obersten Ebene des Dokuments hinzugefügt, wenn es fehlt.

Fazit

Der CodeFixProvider ist ein leistungsstarkes Werkzeug in der Roslyn-API, das Entwicklern hilft, wiederkehrende Code-Probleme automatisch zu beheben. Es fördert sauberen und wartbaren Code, indem es Vorschläge direkt in der IDE unterbreitet und die Benutzerfreundlichkeit erhöht. Die Kombination aus einem DiagnosticAnalyzer und einem CodeFixProvider ermöglicht es, nicht nur Probleme zu erkennen, sondern sie auch sofort zu beheben – was besonders bei großen Projekten oder wiederholten Fehlern extrem nützlich ist.

Durch den modularen Aufbau und die einfache Implementierung können Entwickler ihre eigenen CodeFixProvider schreiben und so maßgeschneiderte Lösungen für ihr Projekt oder ihre Codebasis anbieten.

Weiterführende Artikel

Kategorien

Kontaktieren Sie uns:

Harksheider Weg 60H,
25451 Quickborn
+49 1520 40 73 253
info@gk-itsolutions.de

Schnellzugriff:

Folgt uns auf: