如何使用 Roslyn 查找给定节点之前的节点?

How to find nodes before a given node with Roslyn?

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

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

如果方法调用在循环声明内部,则该方法调用将是循环声明的后代。您可以访问任何 SyntaxNodeAncestors 属性。开始在您检测到的 MethodInvocation 节点的祖先中上升,直到遇到循环或成员声明。

如果你打了一个循环(ForStatementSyntaxWhileStatementSyntax)那么你很好。 如果你点击了一个 MemberDeclarationSyntax 节点,这意味着你已经到达了你的 method1 被调用的任何块的开始,并且可能会抛出一个错误。

此时,您的直接问题大部分 已解决,您必须决定要涵盖多少极端情况。如果它是从 lambda 表达式中调用的呢?如果从循环中调用调用 method1 的方法怎么办?还是来自递归方法?

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