Proviamo a capire come generare codice con Roslyn. Non sto parlando di qualcosa come CSharpSyntaxTree.ParseText
che prenderà alcune stringhe e le convertirà in un AST. Invece, vorrei costruire il mio modello in qualche modo come questo (pseudo codice):Generazione del codice semantico con roslyn
- Creare
file
come unità di compilazione - Aggiungi classe
MyClass
-file
- metodo Add
DoSomething
-MyClass
- Set corpo
DoSomething
in modo simile alSystem.Linq.Expressions
Abbiamo scoperto di recente Microsoft.CodeAnalysis.CSharp.SyntaxFactory
, e sembrava essere promettente. Tuttavia, ovviamente dobbiamo aggiungere noi stessi banalità.
Dopo la creazione di un albero con SyntaxFactory.CompilationUnit()
e l'aggiunta di alcuni membri avanti e indietro, l'output di ToFullString()
è solo un mucchio di testo, che non è né leggibile, né compilabile (ad esempio, parentesi graffe mancanti). Ci manca qualcosa durante la generazione del testo dal modello?
EDIT:
Quando si utilizza aree di lavoro, è possibile impostare le opzioni che influenzano il comportamento di spazi bianchi:
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();
}
Questo produce già un risultato migliore. Qualcuno può confermare questo come una buona soluzione o è piuttosto un hack?
Un problema rimane. Vogliamo generare una proprietà automatica, che attualmente utilizza SF.AccessorDeclaration
ma manca il punto e virgola quando si converte la stringa completa.
Il tuo obiettivo è emettere il codice, giusto? non lo compila? – i3arnon
Sì, ma senza specificare esplicitamente la banalità. Ho anche qualche esperienza con ReSharper SDK, che ha fondamentalmente lo stesso campo di applicazione. Loro * fanno * hanno fabbriche che sono ignare di curiosità, e stampa tutto il codice generato pulito e compilabile. Ho incrociato alcuni commenti di altri utenti che suggeriscono di usare CodeDOM, e che Roslyn non è adatto a questo, ma questo sembrerebbe il più grande fallimento di sempre :) – Matthias
Beh ... Roslyn, essendo un compilatore, ha lo scopo di consumare codice, non produrlo – i3arnon