Roslyn代码重写

mrK*_*mrK 3 c# roslyn

我正在尝试用Roslyn重写代码.我想将GreaterThanToken更改为EqualsEqualsToken.到目前为止,这是我的代码:

public class ToParse
{
    public bool MethodToConvert(int param)
    {
        return (1 > param);
    }
}
Run Code Online (Sandbox Code Playgroud)

执行后,Console.WriteLine打印更改的标记return (1 == param); 但是当我用ilspy打开testassembly.dll时,我仍然看到return 1 > param; 任何建议?

Dav*_*chl 6

[注意:你使用的是较旧版本的Roslyn.这个答案也适用于该版本,但我可以通过更新的名称引用类和成员,以便它们与CodePlex上可用的源匹配.

您解析的原始树包含一个BinaryExpressionSyntax带有a SyntaxKind的节点GreaterThanExpression.当你换出GreaterThanTokenEqualsEqualsToken 这里面BinaryExpressionSyntax,它并不会自动调整含有SyntaxNode一种EqualsExpression.

结果,你最终得到了GreaterThanExpression一个EqualsEqualsToken.由于这不是编译器本身可以合法生成的语法树,因此您可能会看到类似的意外行为.

要在这种情况下生成正确的树,我建议通过覆盖CSharpSyntaxRewriter.VisitBinaryExpression并执行以下操作来重写节点本身而不是令牌:

public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node)
{
    if (node.CSharpKind() == SyntaxKind.GreaterThanExpression)
    {
        return SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, node.Left, node.Right);
    }

    return node;
}
Run Code Online (Sandbox Code Playgroud)