如何在Roslyn的给定节点之前找到节点?

时间:2017-08-14 15:24:52

标签: c# roslyn roslyn-code-analysis

我正在开发一个Roslyn分析器来检测特定方法method1的使用。我想允许在forwhile循环中使用此方法,并在代码中的所有其他情况下创建问题。

我该怎么做?我开发的代码在任何地方都检测到method1。我现在每次找到该函数时都想要检查它是否处于循环中,并且只有当它不在循环中时才会生成错误。

1 个答案:

答案 0 :(得分:2)

如果循环声明在其中,则方法调用将是循环声明的后代。您可以访问任何SyntaxNode的{​​{3}}属性。在您检测到的MethodInvocation节点的祖先之间开始上升,直到您遇到循环或成员声明。

如果您点击循环(ForStatementSyntaxWhileStatementSyntax),那么您就是好人。 如果你点击MemberDeclarationSyntax节点,这意味着你已经到达了调用method1的任何块的开头,并且可能会抛出错误。

此时,您的直接问题是主要已解决,您必须决定要覆盖多少个角落案例。如果从lambda表达式调用它会怎么样?如果从循环中调用调用method1的方法会怎样?还是从递归方法?

您可以检测所有这些案例,但您必须决定是否值得付出努力。