Jak używać Roslyn do modyfikowania kodu źródłowego? Nie mogę utworzyć SyntaxNode i wstawić w SyntaxTree. Lub użyj alternatywy (Antrl, NRefactory lub coś innego)?Jak zmodyfikować kod źródłowy za pomocą Roslyn?
Odpowiedz
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.
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!
Zakładam, że ten kod wymaga użycia instrukcji takiej jak 'using Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory;' do kompilacji. – Anssssss
Dzięki za odpowiedź. Znalazłem NodeOrTokenList. Jak przesłać NodeOrTokenList do SyntaxNode? – user3382135
@ 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