C# 代码分析器-删除节点失败,无异常

C# 代码分析器-删除节点失败,无异常,c#,code-analysis,roslyn,roslyn-code-analysis,C#,Code Analysis,Roslyn,Roslyn Code Analysis,你可能已经猜到了,我正在学习所有关于roslyn的知识,尤其是作为一名代码分析器 语法高亮显示工作正常。但是,以下操作(即我的代码操作)在删除节点时以静默方式失败: private async Task<Document> RemoveNode(Document document, LocalDeclarationStatementSyntax typeDecl, CancellationToken cancellationToken) { IEnum

你可能已经猜到了,我正在学习所有关于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);
    }
我觉得我错过了如何与Roslyn合作的“大局”,因此,尽管这里的帮助将是令人惊讶的,但我也希望有一些链接/资源可以帮助我

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


谢谢

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

异常令人困惑(已经是这样),但实际上是您的错误:您试图从其父级中删除
VariableDeclarationSyntax
,即
LocalDeclarationStatementSyntax
(其语法类似于LocalDeclarationStatement:
const
?VariableDeclaration
)。由于没有VariableDeclarationSyntax的
LocalDeclarationStatementSyntax
无效,因此会出现异常

最简单的修复方法是删除父级
LocalDeclarationStatementSyntax

SyntaxNode newRoot = oldRoot.RemoveNode(oldNode.Single().Parent, SyntaxRemoveOptions.KeepNoTrivia);

你到底是如何调用代码的?你能帮我发封邮件吗?我可以走了。我开始尝试标记IDisTables,但将问题简化为简单地尝试删除节点。
SyntaxNode newRoot = oldRoot.RemoveNode(oldNode.Single().Parent, SyntaxRemoveOptions.KeepNoTrivia);