如何在使用Roslyn的给定节点之前查找节点?
问题描述:
我正在开发Roslyn分析器来检测特定方法的使用,method1
。我想允许在for
和while
循环中使用此方法,并在代码中的所有其他情况下创建一个问题。如何在使用Roslyn的给定节点之前查找节点?
我该怎么做?我开发的代码随处可见method1
。每次我找到函数时,我都会想要检查它是否在循环中,并且只有在循环中不产生错误。
答
该方法调用将是循环声明的后代,如果它在其中。您可以访问任何SyntaxNode
的Ancestors
资产。开始在您检测到的MethodInvocation
节点的祖先中间,直到您点击循环或成员声明。
如果你打了一个循环(ForStatementSyntax
或WhileStatementSyntax
),那么你很好。 如果你点击一个MemberDeclarationSyntax
节点,这意味着你已经到达了你调用method1
的任何块的开始,并且可能会抛出一个错误。
在这一点上,你的直接问题是主要是解决了,你必须决定你想要覆盖多少个角落案例。如果从lambda表达式调用它会怎么样?如果调用method1
的方法是从循环中调用的呢?或从递归方法?
您可以检测到所有这些情况,但您必须决定是否值得您付出努力。
但是,您希望允许的* nesting *级别是什么?你的分析仪应该离呼叫栈多远?如果你有一个调用链'methodN'->'method2'->'method1'并且调用这个链的循环在'methodN'中?另外,考虑一下在运行时和编译时代码结构不一样的事实。如果您将'method1'作为委托传递给另一个将其封装在循环中的方法,那么在运行时呢?就像LINQ使用'Func'一样。 – ironstone13