Ich habe einige Probleme mit dem Hinzufügen eines Ausdrucks zum SyntaxTree mit Roslyn. Was ich erreichen muss, ist folgendes: Immer wenn ich eine spezielle Anweisung finde, möchte ich einen oder mehrere Ausdrücke nach diese Aussage einfügen.Einfügen neuer Ausdruck nach Anweisung über Roslyn
Sagen wir, ich möchte die Anweisung "myVar = myVar + 1" nach jeder Anweisung einfügen, die die Variable "testVar" schreibt.
So folgender Ausschnitt:
a = 10;
testVar = 50;
a = testVar/a;
testVar = a;
Sollte in dieses Stück Code umgewandelt werden:
a = 10;
testVar = 50;
myVar = myVar + 1;
a = testVar/a;
testVar = a;
myVar = myVar + 1;
Mein aktueller Ansatz nutzt den SyntaxVisitor mit der Methode 'SyntaxNode VisitExpressionStatement (ExpressionStatement Knoten)'. Diese Methode ruft alle Ausdrücke im SyntaxTree auf und ermöglicht es, den besuchten Ausdruck durch den zurückgegebenen SyntaxNode zu ersetzen. Allerdings möchte ich nicht ersetzen Anweisungen, aber fügen Sie neue Ausdrücke nach ihnen, die grundsätzlich erfordert zwei Ausdrücke zurückgegeben werden. Die einzige Lösung, die ich gefunden habe, ist die Verwendung von "BlockSyntax", die als Container für die beiden Ausdrücke dient (siehe Codeausschnitt [0]). Leider führt „BlockSyntax“ geschweifte Klammern um sich selbst, die zu folgendem Ergebnis führen:
a = 10;
{
testVar = 50;
myVar = myVar + 1;
}
a = testVar/a;
{
testVar = a;
myVar = myVar + 1;
}
Dieser Ansatz für mich nicht akzeptabel ist, wie ich will nicht über die Bereiche manipulieren. Gibt es eine Möglichkeit, beliebige Ausdrücke an einem Ort meiner Wahl mit Roslyn einzufügen?
[0]
public SyntaxNode VisitExpressionStatement(ExpressionStatement node){
if(node has special characteristics){
var newExpression = ...
var newStatmentList = new Roslyn.Compilers.CSharp.SyntaxList<StatementSyntax>();
newStatmentList = newStatmentList.Insert(newStatmentList.Count, node);
newStatmentList = newStatmentList.Insert(newStatmentList.Count, newExpression);
BlockSyntax newBlock = Syntax.Block(newStatmentList);
return newBlock;
}
else {
return node;
}
}