查看编辑器
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
作为表达式。
我正在使用 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
作为表达式。