Verstehen des .NET Compiler Platform SDK-Modells
Compiler verarbeiten den von Ihnen geschriebenen Code, indem sie sich an strenge Regeln halten, die sich häufig von der Weise unterscheiden, wie Menschen Code lesen und verstehen. Es ist wichtig, dass Sie über grundlegende Kenntnisse zur Funktionsweise des vom Compiler verwendeten Modells verfügen, damit Sie ein Verständnis über die APIs erlangen, die Sie zum Erstellen von Roslyn-basierten Tools verwenden.
Funktionsbereiche der Compilerpipeline
Das .NET Compiler Platform SDK stellt Ihnen als Consumer die Codeanalyse des Compilers für C# und Visual Basic zur Verfügung, indem es eine API-Ebene bereitstellt, die eine traditionelle Compilerpipeline nachahmt.
Jede Phase dieser Pipeline stellt eine separate Komponente dar. Zunächst wird in der Analysephase Quelltext in Token zerlegt und analysiert, sodass eine Syntax entsteht, die der Grammatik der Sprache entspricht. Dann werden in der Deklarationsphase die Quelle und importierte Metadaten analysiert, sodass sie benannte Symbole formen. In der Bindungsphase werden Bezeichner im Code Symbolen zugeordnet. Zuletzt werden in der Ausgabephase Assemblys mit sämtlichen Informationen ausgegeben, die vom Compiler erstellt wurden.
Für jede dieser Phasen stellt das .NET Compiler Platform SDK ein Objektmodell zur Verfügung, das Zugriff auf die Informationen zu der jeweiligen Phase gewährt. In der Analysephase wird eine Syntaxstruktur zur Verfügung gestellt, in der Deklarationsphase eine hierarchische Symboltabelle und in der Bindungsphase das Ergebnis der semantischen Analyse des Compilers. Die Ausgabephase besteht aus einer API, die IL-Bytecode erstellt.
Jeder Compiler vereint diese Komponenten zu einem End-to-End-Objekt.
Bei diesen APIs handelt es sich um dieselben, die von Visual Studio verwendet werden. Beispielsweise verwenden die Features zur Codegliederung und -formatierung die Syntaxstrukturen. Der Objektkatalog und die Navigationsfeatures verwenden die Symboltabelle, beim Refactoring und bei Zu Definition wechseln wird das Semantikmodell verwendet, und Bearbeiten und Fortfahren verwendet all diese Elemente, einschließlich der Ausgabe-API.
API-Ebenen
Das .NET-Compiler-SDK besteht aus mehreren Ebenen von APIs: Compiler-APIs, Diagnose-APIs, Skript-APIs und Arbeitsbereich-APIs.
Compiler-APIs
Die Compilerebene enthält die Objektmodelle, die mit den Informationen syntaktisch und semantisch übereinstimmen, die in den einzelnen Phasen der Compilerpipeline zur Verfügung gestellt werden. Die Compilerebene enthält außerdem eine nicht veränderbare Momentaufnahme eines einzelnen Aufrufs eines Compilers, einschließlich Assemblyverweisen, Compileroptionen und Quellcodedateien. Es gibt zwei unterschiedliche APIs, die die Sprachen C# und Visual Basic darstellen. Diese beiden APIs verfügen zwar über eine ähnliche Form, sind aber jeweils auf einen hohen Treuegrad in Bezug auf die einzelnen Sprachen ausgelegt. Diese Ebene ist unabhängig von Visual Studio-Komponenten.
Diagnose-APIs
Im Rahmen einer Analyse erstellt der Compiler möglicherweise mehrere Diagnosen, die angefangen bei Syntax, Semantik und eindeutigen Zuweisungsfehlern bis hin zu Warnungen und informativen Diagnosen alles abdecken. Die API-Ebene des Compilers stellt über eine erweiterbare API Diagnosen zur Verfügung, über die benutzerdefinierte Analysetools an den Kompilierungsprozess angeschlossen werden. Außerdem können dadurch neben vom Compiler definierten Diagnosen benutzerdefinierte Diagnosen erstellt werden, die beispielsweise von Tools wie StyleCop erstellt werden. Wenn Diagnosen so erstellt werden, hat dies den Vorteil, dass diese auf natürliche Weise in Tools wie MSBuild und Visual Studio integriert werden. Diese Tools sind von Diagnosen abhängig, um z. B. einen Build basierend auf Richtlinien anzuhalten oder Wellenlinien direkt im Editor anzuzeigen und Behebungen für Codefehler vorzuschlagen.
Erstellung von API-Skripts
Host- und Skript-APIs basieren auf der Compilerebene. Sie können die Skript-APIs verwenden, um Codeausschnitte auszuführen und einen Laufzeitausführungskontext anzusammeln. Die interaktive C#-REPL (read–eval–print loop) verwendet diese APIs. Mithilfe der REPL können Sie C# als Skriptsprache verwenden und den Code beim Schreiben interaktiv ausführen.
Arbeitsbereich-APIs
Die Arbeitsbereich-API ist auf Arbeitsbereichebene enthalten. Sie stellt einen Startpunkt für die Codeanalyse und das Refactoring ganzer Projektmappen dar. Sie unterstützt Sie bei der Aufteilung der Informationen zu den Projekten in einer Projektmappe in einzelne Objektmodelle, gewährt Ihnen direkten Zugriff auf die Objektmodelle auf Compilerebene, ohne dabei Dateien zu analysieren, Optionen zu konfigurieren oder Abhängigkeit zwischen einzelnen Projekten zu verwalten.
Außerdem befinden sich auf Arbeitsbereichsebene mehrere APIs, die bei der Implementierung von Codeanalysen und beim Refactoring von Tools verwendet werden, die in einer Hostumgebung wie der Visual Studio-IDE funktionieren. Nehmen Sie „Alle Verweise suchen“-, „Formatieren“- und Codegenerierungs-APIs als Beispiele.
Diese Ebene ist unabhängig von Visual Studio-Komponenten.