Generieren semantischer Code mit Roslyn

8

Wir versuchen herauszufinden, wie man mit Roslyn Code erzeugt. Ich spreche nicht von etwas wie CSharpSyntaxTree.ParseText , das einige Zeichenfolgen braucht und sie in einen AST umwandelt. Stattdessen möchte ich mein Modell irgendwie so aufbauen (Pseudocode):

  1. Erstellen Sie file als Kompilierungseinheit
  2. Hinzufügen der Klasse MyClass zu file
  3. Fügen Sie die Methode DoSomething zu MyClass hinzu
  4. Setze den Körper von DoSomething in ähnlicher Weise wie System.Linq.Expressions

Wir haben kürzlich Microsoft.CodeAnalysis.CSharp.SyntaxFactory entdeckt und es schien vielversprechend zu sein. Allerdings müssen wir natürlich selbst etwas hinzufügen.

Nachdem Sie einen Baum mit SyntaxFactory.CompilationUnit() erstellt und einige Elemente hin und her hinzugefügt haben, ist die Ausgabe von ToFullString() nur ein Haufen Text, der weder lesbar noch kompilierbar ist (z. B. fehlende Klammern). Vermissen wir etwas beim Erzeugen des Textes aus dem Modell?

BEARBEITEN:

Wenn Sie Arbeitsbereiche verwenden, können Sie Optionen festlegen, die sich auf das Whitespace-Verhalten auswirken:

%Vor%

Dies führt bereits zu einem besseren Ergebnis. Kann jemand dies als eine gute Lösung bestätigen oder ist es eher ein Hack?

Ein Problem bleibt bestehen. Wir möchten eine Auto-Eigenschaft generieren, die derzeit SF.AccessorDeclaration verwendet, aber das Semikolon bei der Konvertierung in die vollständige Zeichenfolge nicht enthält.

    
Matthias 08.01.2015, 14:13
quelle

1 Antwort

10

Sie müssen grundsätzlich Blockdefinitionen hinzufügen, dann behandelt Roslyn das Wissen für Sie, solange Sie den Formatierer verwenden (wie Sie es geschrieben haben)

Hier ist ein Beispiel für eine einfache Klasse, die korrekt generiert wird, ohne dass ich irgendwelche Kleinigkeiten angeben muss

%Vor%

Hinweis: Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory

Dies erzeugt die folgende Klassen-Definition:

%Vor%

Scheint gut.

    
Inspyro 09.01.2015 08:19
quelle

Tags und Links