【问题标题】:Code Analyzer - removing a node fails without exception代码分析器 - 删除节点失败无异常
【发布时间】:2016-04-07 22:13:10
【问题描述】:

正如您可能已经猜到的那样,我正在学习有关 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

谢谢

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2018-03-13
    • 2020-04-12
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多