2015-03-02 2 views
1

Я использую Рослины-х CSharpSyntaxRewriter переписать следующим образом:Rewrite SyntaxNode два SyntaxNodes

string myString = "Hello "; 
myString += "World!"; 

к:

string myString = "Hello "; 
myString += "World!"; Log("myString", myString); 

Моего синтаксис ReWriter переопределяет VisitAssignmentExpression следующим образом.

Я был в состоянии «обмануть» это ограничение при работе с StatementSyntax путем построения BlockSyntax с отсутствующими скобками:

var statements = new SyntaxList<StatementSyntax>(); 
//Tried bundling newNode and invocation together 
statements.Add(SyntaxFactory.ExpressionStatement(newNode)); 
statements.Add(SyntaxFactory.ExpressionStatement(invocation)); 
var wrapper = SyntaxFactory.Block(statements); 

//Now we can remove the { and } braces 
wrapper = wrapper.WithOpenBraceToken(SyntaxFactory.MissingToken(SyntaxKind.OpenBraceToken)) 
    .WithCloseBraceToken(SyntaxFactory.MissingToken(SyntaxKind.CloseBraceToken) 

Однако этот подход не будет работать с AssignmentExpressionSyntax, как BlockSyntax не может быть брошено до ExpressionSyntax. (The CSharpSyntaxRewriter tries to make this cast.)

Как я могу переписать один SyntaxNode на два SyntaxNodes?

Я столкнулся с ограничением API, или есть какие-либо трюки, подобные вышеуказанным, которые кто-то мог бы поделиться?

ответ

1

Вам необходимо посетить родителя ExpressionStatementSyntax и заменить его на BlockSyntax.

Вы не можете вставить BlockSyntax в качестве выражения в выражении выражения.

Смежные вопросы