代码分析器 - 删除节点无一例外地失败

时间:2016-04-07 22:13:10

标签: c# code-analysis roslyn roslyn-code-analysis

您可能已经猜到我正在学习所有关于roslyn的知识,特别是作为代码分析器。

语法高亮显示工作正常。但是,以下 - 这是我的代码操作 - 在删除节点时无声地失败:

    private async Task<Document> RemoveNode(Document document, LocalDeclarationStatementSyntax typeDecl, CancellationToken cancellationToken)
    {
        IEnumerable<SyntaxNode> oldNode = typeDecl.DescendantNodes().OfType<VariableDeclarationSyntax>();

        SyntaxNode oldRoot = await document.GetSyntaxRootAsync(cancellationToken);

        SyntaxNode newRoot = oldRoot.RemoveNode(oldNode.Single(), SyntaxRemoveOptions.KeepNoTrivia); //Analyzer fails here

        return document.WithSyntaxRoot(newRoot);
    }

主题:

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            FruitMix fm = new FruitMix(); //This is the matched node
        }
    }
}

我觉得我错过了如何与Roslyn合作的“更大”图片,所以尽管这里的帮助会很棒,但我也会喜欢一些能帮助我的链接/资源。

我上传了这个project here虽然不是“最小化”的例子,但它很容易重现这个问题。上面的代码位于CodeFixProvider.cs

由于

1 个答案:

答案 0 :(得分:1)

当我在启用了所有抛出的异常的情况下运行代码时,我可以看到它在ArgumentNullException内的调用堆栈中向RemoveNode()深处抛出,特别是在SyntaxFactory.LocalDeclarationStatement()中。

异常令人困惑(已经是reported on GitHub),但实际上是您的错误:您正在尝试从其父VariableDeclarationSyntax移除LocalDeclarationStatementSyntax(语法对于那将是 LocalDeclarationStatement const VariableDeclaration ;)。由于没有LocalDeclarationStatementSyntax的{​​{1}}无效,您将获得例外。

最简单的解决方法是删除父VariableDeclarationSyntax

LocalDeclarationStatementSyntax