2014-10-20 6 views

Odpowiedz

3

Możesz utworzyć SyntaxNode s używając SyntaxFactory.

Nie można modyfikować istniejącego drzewa składni (ponieważ jest ono niezmienne), ale można utworzyć nowy zawierający węzeł. Spójrz na metody With- i Add-, i CSharpSyntaxVisitor. Trudno powiedzieć, który z nich najlepiej pasuje do twoich potrzeb.

+0

Dzięki za odpowiedź. Znalazłem NodeOrTokenList. Jak przesłać NodeOrTokenList do SyntaxNode? – user3382135

+1

@ user3382135 Nie wiesz i nie rozumiem, dlaczego chcesz to zrobić. Myślę, że powinieneś zadać nowe pytanie, wyjaśniając, co chcesz zrobić i dlaczego uważasz, że potrzebujesz do tego NodeOrTokenList. – svick

2

W jaki sposób svick odpowiedział na ciebie - nie możesz modyfikować istniejącego drzewa składni. Drzewo Sytnax jest niezmienne, ale możesz stworzyć inny na podstawie istniejącego. W tym celu należy utworzyć węzeł i zastąpić istniejący. Poniżej można Prosty przykład (zmiana za pomocą):

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()); 

W przypadku niezmienne o to notatka z PRZYGOTOWANIA dokumentu:

Podstawowym założeniem API Roslyn jest niezmienność. Ponieważ niezmienne struktury danych nie mogą zostać zmienione po ich utworzeniu, mogą być bezpiecznie udostępniane i analizowane przez wielu klientów jednocześnie, bez niebezpieczeństwa, że ​​jedno narzędzie wpływa na inne w nieprzewidywalny sposób. Nie są wymagane żadne zamki ani inne środki współbieżności. Dotyczy to drzew składniowych, kompilacji, symboli, modeli semantycznych i każdej innej struktury danych w interfejsie API Roslyn. Zamiast modyfikacji tworzone są nowe obiekty w oparciu o określone różnice w stosunku do starych. Zastosujesz tę koncepcję do drzewek składni, aby utworzyć transformacje drzew!

+0

Zakładam, że ten kod wymaga użycia instrukcji takiej jak 'using Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory;' do kompilacji. – Anssssss