小编Jef*_*fin的帖子

SyntaxRewriter和多个语句

我在Roslyn中使用SyntaxRewriter遇到了棘手的情况.我想重写某些类型的语句,包括局部变量声明.该解决方案要求我将有问题的语句转换为多个语句,如下面的简单示例所示:

void method()
{
    int i;
}
Run Code Online (Sandbox Code Playgroud)

void method()
{
    int i;
    Console.WriteLine("I declared a variable.");
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了其他使用块来完成类似事情的例子,当然在变量声明的情况下,声明的范围也会受到影响.我提出了以下解决方案,但我正在喋喋不休.它似乎过于复杂,需要中断访问者模式:

class Rewriter: SyntaxRewriter
{
    public override SyntaxList<TNode> VisitList<TNode>(SyntaxList<TNode> list)
    {
        if (typeof(TNode) == typeof(StatementSyntax))
            return Syntax.List<TNode>(list.SelectMany(st => RewriteStatementInList(st as StatementSyntax).Cast<TNode>()));
        else
            return base.VisitList<TNode>(list);
    }

    private IEnumerable<SyntaxNode> RewriteStatementInList(StatementSyntax node)
    {
        if (node is LocalDeclarationStatementSyntax)
            return PerformRewrite((LocalDeclarationStatementSyntax)node);
        //else if other cases (non-visitor) 

        return Visit(node).AsSingleEnumerableOf();
    }

    private IEnumerable<SyntaxNode> PerformRewrite(LocalDeclarationStatementSyntax orig)
    {
        yield return orig;
        yield return Syntax.ParseStatement("Console.WriteLine(\"I declared a variable.\");");
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?编辑语句并删除它们(通过空语句)似乎比重写多次更直接.

我接受了答案: …

roslyn

6
推荐指数
1
解决办法
2001
查看次数

标签 统计

roslyn ×1