In che modo l'utilizzo di Roslyn modifica il codice sorgente? Non riesco a creare SyntaxNode e inserirmi in SyntaxTree. Oppure utilizzare alternative (Antrl, NRefactory o qualcos'altro)?Come modificare il codice sorgente utilizzando Roslyn?
risposta
È possibile creare SyntaxNode
s utilizzando SyntaxFactory
.
E non è possibile modificare un albero di sintassi esistente (perché è immutabile), ma è possibile crearne uno nuovo contenente il nodo. Guarda i metodi With-
e Add-
, ReplaceNode
e CSharpSyntaxVisitor
. È difficile dire quale di queste soddisfi maggiormente le tue esigenze.
In che modo lo svick ha risposto: non è possibile modificare l'albero di sintassi esistente. L'albero Sytnax è immutabile ma è possibile crearne un altro basato su esistente. Per questo scopo devi creare un nodo e sostituire quello esistente. Qui di seguito potete esempio semplice (modificare utilizzando):
var name = Syntax.QualifiedName(Syntax.IdentifierName("System"), Syntax.IdentifierName("Collections"));
name = Syntax.QualifiedName(name, Syntax.IdentifierName("Generic"));
SyntaxTree tree = SyntaxTree.ParseText(
@"using System;
using System.Collections;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(""Hello, World!"");
}
}
}");
var root = (CompilationUnitSyntax)tree.GetRoot();
var oldUsing = root.Usings[1];
var newUsing = oldUsing.WithName(name);
root = root.ReplaceNode(oldUsing, newUsing);
Console.WriteLine(root.GetText());
In caso di immutabile qui è una nota di ottenere documento iniziato:
Un principio fondamentale della API Roslyn è immutabilità. Poiché le strutture di dati immutabili non possono essere modificate dopo la loro creazione, possono essere condivise e analizzate in modo sicuro da più utenti contemporaneamente senza i pericoli di uno strumento che ne influenza un altro in modi imprevedibili. Non sono necessarie serrature o altre misure di concorrenza. Questo vale per gli alberi di sintassi, le compilazioni, i simboli, i modelli semantici e ogni altra struttura di dati nell'API Roslyn. Invece di modificare, vengono creati nuovi oggetti basati su differenze specifiche rispetto a quelli vecchi. Applicerai questo concetto alla sintassi degli alberi per creare trasformazioni di alberi!
Presumo che questo codice richieda un'istruzione using come 'using Sintassi = Microsoft.CodeAnalysis.CSharp.SyntaxFactory;' per compilare. – Anssssss
- 1. Modifica codice sorgente in fase di compilazione con Roslyn
- 2. Eclipse: è possibile modificare il codice sorgente Java conosciuto tramite il codice sorgente "allegato"
- 3. Come iniziare a modificare il codice sorgente per Chromium?
- 4. Come posso modificare il codice sorgente della tastiera os Android?
- 5. Modificare il file di codice sorgente Clojure in clojure
- 6. Codice sorgente offuscamento
- 7. Ottieni AST da. Assemblaggio Net senza codice sorgente (codice IL)
- 8. intelligente refactoring utilizzando Roslyn CTP
- 9. Come analizzare il codice sorgente di Blender
- 10. Come indentare automaticamente il codice sorgente?
- 11. Come indicizzare il codice sorgente con ElasticSearch
- 12. Come ottengo il codice sorgente di Ubuntu?
- 13. Come scaricare il codice sorgente di Eclipse?
- 14. Golang: proteggere il codice sorgente
- 15. Contrassegnare le funzioni della libreria come deprecate/inutilizzabili senza modificare il codice sorgente
- 16. Modificare un messaggio di commit tramite il controllo del codice sorgente in Xcode
- 17. ClearCase per il controllo del codice sorgente?
- 18. Impossibile modificare il codice sorgente in VS Texteditor quando è in esecuzione il programma di ricerca
- 19. Codice sorgente Android download
- 20. Generazione del codice semantico con roslyn
- 21. Emit per DynamicAssembly con il codice di Roslyn RC
- 22. Formattazione del codice a Roslyn SDK Anteprima
- 23. Come calcolare il numero di linee in codice sorgente
- 24. Come ottenere il corpo di un metodo con roslyn?
- 25. Come modificare la proprietà css utilizzando jquery con questo codice
- 26. Aggiungi il modificatore di accesso al metodo utilizzando Roslyn CodeFixProvider?
- 27. Utilizzo di ANTLR per analizzare e modificare il codice sorgente; sto sbagliando?
- 28. Come modificare il codice sorgente senza rieseguire cfx e Firefox durante il debug di un componente aggiuntivo SDK?
- 29. Trovare il codice sorgente di cromo
- 30. Come modificare il file xml utilizzando PHP
Grazie per la risposta. Ho trovato NodeOrTokenList. In che modo NodeOrTokenList è stato sincronizzato con SyntaxNode? – user3382135
@ user3382135 Non lo fai e non capisco perché vorresti farlo. Penso che dovresti fare una nuova domanda, spiegando cosa vuoi fare e perché pensi di aver bisogno di NodeOrTokenList per quello. – svick