Staramy się dowiedzieć, jak wygenerować kod z Roslyn. Nie mówię o czymś takim, jak CSharpSyntaxTree.ParseText
, które zajmie kilka ciągów i przekształci je w AST. Zamiast tego chciałbym zbudować mój model jakoś tak (pseudo kod):Generowanie kodu semantycznego z roslyn
- Tworzenie
file
jako jednostki kompilacji - Dodaj klasa
MyClass
dofile
- metody Add
DoSomething
doMyClass
- Set ciało
DoSomething
w podobny sposób, jakSystem.Linq.Expressions
Niedawno odkryliśmy Microsoft.CodeAnalysis.CSharp.SyntaxFactory
, i wydawało się obiecujące. Oczywiście musimy sami dodawać ciekawostki.
Po zbudowaniu drzewa o numerze SyntaxFactory.CompilationUnit()
i dodaniu niektórych elementów tam i z powrotem, wynik ToFullString()
jest po prostu garstką tekstu, który nie jest ani czytelny, ani kompilowany (np. Brakujące nawiasy klamrowe). Czy brakuje nam czegoś podczas generowania tekstu z modelu?
EDIT:
Podczas korzystania obszarów roboczych, można ustawić opcje wpływające na zachowanie białe znaki:
public string Generate (CompilationNode rootNode)
{
var cw = new CustomWorkspace();
cw.Options.WithChangedOption (CSharpFormattingOptions.IndentBraces, true);
var formattedCode = Formatter.Format (CreateFile(rootNode), cw);
return formattedCode.ToFullString();
}
To już daje lepszy wynik. Czy ktoś może to potwierdzić jako dobre rozwiązanie, czy raczej hack?
Jeden problem pozostaje. Chcemy wygenerować auto-własność, która obecnie używa SF.AccessorDeclaration
, ale pomija średnik przy konwersji do pełnego łańcucha.
Twoim celem jest emitowanie kodu, prawda? nie skompilować? – i3arnon
Tak, ale bez wyraźnego określania ciekawostek. Mam też trochę doświadczenia z użyciem ReSharper SDK, który zasadniczo ma to samo pole zastosowania. Oni * mają * fabryki, które nie znają drobiazgów, i drukuje cały wygenerowany kod w sposób czysty i umożliwiający kompilację. Przeszedłem kilka komentarzy innych użytkowników sugerujących użycie CodeDOM, i że Roslyn prawdopodobnie nie nadaje się do tego, ale wydawałoby się, że to największy niepowodzenie w historii :) – Matthias
Cóż ... Roslyn, będący kompilatorem, jest przeznaczony do spożywania kodu, nie produkuj go. – i3arnon