查看编辑器

Rewrite SyntaxNode to two SyntaxNodes

我正在使用 Roslyn 的 CSharpSyntaxRewriter 重写以下内容:

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

至:

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

我的语法重写器重写了 VisitAssignmentExpression,如下所示。

public override SyntaxNode VisitAssignmentExpression(AssignmentExpressionSyntax node)
{
    //Construct a new node without trailing trivia
    var newNode = node.WithoutTrailingTrivia();
    InvocationExpressionSyntax invocation = //Build proper invocation

    //Now what? I need to bundle up newNode and invocation and return them
    //as an expression syntax
}

在处理 StatementSyntax 时,我已经能够 "cheat" 通过构建缺少大括号的 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重写为两个SyntaxNode?

我是否 运行 遇到了 API 的限制,或者是否有人可以分享与上述类似的技巧?

您需要访问父级 ExpressionStatementSyntax 并将其替换为 BlockSyntax

不能在表达式语句中插入 BlockSyntax 作为表达式。