【问题标题】:How to find nodes before a given node with Roslyn?如何使用 Roslyn 查找给定节点之前的节点?
【发布时间】:2017-08-16 20:02:12
【问题描述】:

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

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

【问题讨论】:

  • 但是您希望允许的 嵌套 级别是多少?您的分析器应该在调用堆栈中走多远?如果你有一个调用链methodN->method2->method1 并且调用这个链的循环在methodN 中怎么办?另外,想想你的代码在运行时和编译时的结构是不一样的。如果您在运行时将method1 作为委托传递给另一个将其包装在循环中的方法会怎样?比如 LINQ 使用 Func

标签: c# roslyn roslyn-code-analysis


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多