代码分析器 - 删除节点无一例外地失败
Code Analyzer - removing a node fails without exception
您可能已经猜到了,我正在学习有关 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 的 'bigger' 图片,所以尽管这里的帮助会很棒,但我也喜欢一些对我有帮助的链接/资源。
我上传了这个 project here 虽然不是 'minimial' 示例,但它很容易重现问题。上面的代码在CodeFixProvider.cs
.
谢谢
当我 运行 你的代码启用了所有抛出的异常时中断,我可以看到它在 RemoveNode()
内的调用堆栈深处抛出 ArgumentNullException
,特别是在 [=13] =].
异常令人困惑(已经是 reported on GitHub),但这实际上是你的错误:你试图从其父级中删除 VariableDeclarationSyntax
,即 LocalDeclarationStatementSyntax
(其语法类似于 LocalDeclarationStatement : const
? VariableDeclaration ;
)。由于没有 VariableDeclarationSyntax
的 LocalDeclarationStatementSyntax
无效,因此您会得到异常。
最简单的解决方法是只删除父级 LocalDeclarationStatementSyntax
:
SyntaxNode newRoot = oldRoot.RemoveNode(oldNode.Single().Parent, SyntaxRemoveOptions.KeepNoTrivia);
您可能已经猜到了,我正在学习有关 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 的 'bigger' 图片,所以尽管这里的帮助会很棒,但我也喜欢一些对我有帮助的链接/资源。
我上传了这个 project here 虽然不是 'minimial' 示例,但它很容易重现问题。上面的代码在CodeFixProvider.cs
.
谢谢
当我 运行 你的代码启用了所有抛出的异常时中断,我可以看到它在 RemoveNode()
内的调用堆栈深处抛出 ArgumentNullException
,特别是在 [=13] =].
异常令人困惑(已经是 reported on GitHub),但这实际上是你的错误:你试图从其父级中删除 VariableDeclarationSyntax
,即 LocalDeclarationStatementSyntax
(其语法类似于 LocalDeclarationStatement : const
? VariableDeclaration ;
)。由于没有 VariableDeclarationSyntax
的 LocalDeclarationStatementSyntax
无效,因此您会得到异常。
最简单的解决方法是只删除父级 LocalDeclarationStatementSyntax
:
SyntaxNode newRoot = oldRoot.RemoveNode(oldNode.Single().Parent, SyntaxRemoveOptions.KeepNoTrivia);