2014-10-20 21 views

risposta

3

È 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.

+0

Grazie per la risposta. Ho trovato NodeOrTokenList. In che modo NodeOrTokenList è stato sincronizzato con SyntaxNode? – user3382135

+1

@ 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

2

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!

+0

Presumo che questo codice richieda un'istruzione using come 'using Sintassi = Microsoft.CodeAnalysis.CSharp.SyntaxFactory;' per compilare. – Anssssss

Problemi correlati