2017-08-14 95 views
0

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

我该怎么做?我开发的代码随处可见method1。每次我找到函数时,我都会想要检查它是否在循环中,并且只有在循环中不产生错误。

+2

但是,您希望允许的* nesting *级别是什么?你的分析仪应该离呼叫栈多远?如果你有一个调用链'methodN'->'method2'->'method1'并且调用这个链的循环在'methodN'中?另外,考虑一下在运行时和编译时代码结构不一样的事实。如果您将'method1'作为委托传递给另一个将其封装在循环中的方法,那么在运行时呢?就像LINQ使用'Func'一样。 – ironstone13

回答

2

该方法调用将是循环声明的后代,如果它在其中。您可以访问任何SyntaxNodeAncestors资产。开始在您检测到的MethodInvocation节点的祖先中间,直到您点击循环或成员声明。

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

在这一点上,你的直接问题是主要是解决了,你必须决定你想要覆盖多少个角落案例。如果从lambda表达式调用它会怎么样?如果调用method1的方法是从循环中调用的呢?或从递归方法?

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

相关问题