3

我正在尝试编写一个自定义的 FxCop 代码分析规则,该规则将警告开发人员不要使用包含太深嵌套代码块的方法,并敦促他们重新考虑混乱。

前任。我试图避免以下情况:

if(condition)
{
   foreach(var item in items)
   {
       if(anotherCondition)
       {
           for(var product in item.Products)
           {
               // even more nested statement blocks...
           }
       }
   }
}

当我覆盖计算块深度的VisitBlock(Block block)方法时,我得到一个stackoverflow
,因为显然,从块的一个属性到块本身存在一个循环引用。即以下对于某些 i 是正确的:block.Statements[i] == block

为什么会存在这样的循环引用?如何避免?谢谢!

4

1 回答 1

0

经过更多研究,我发现我实际上有两个主要问题

  1. VisitXXX 方法不是访问源代码的抽象语法树中的 节点,而是实际访问生成的 IL 中的节点。只需比较每个方法生成的 IL 指令和每个 method.Body 生成的语句。
    我想知道如果 FxCop 可以为我们提供真正的 AST 访问者,我们能取得什么成就?
  2. 回答我最初的问题,为了防止开发者编写太多嵌套代码块,我们应该自己扫描方法代码,我的意思是,取出SourceContext属性中的起始行和结束行method.Body并跟踪每个' {' 和 '}' 我们发现。'{' 的增量计数器和 '}' 的减量计数器。那应该有效,对吧?
于 2011-02-12T07:55:36.243 回答