2011-02-09 30 views
3

我試圖寫一個自定義的FxCop代碼分析規則 將從包含嵌套太深代碼塊, 方法警告開發者,並會督促他們重新因子搞的一塌糊塗。與代碼分析無限循環的FxCop反思

ex。我試圖避免以下情況:

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

我得到一個計算器,當我重寫VisitBlock(Block block)方法
計數塊的深度,因爲很明顯,有從屬性的一個循環參考 該塊本身爲 。 即對於某些我:block.Statements [i] ==塊

爲什麼存在這樣的循環參考?如何避免它? 謝謝!

+1

請提供重現問題的示例代碼(適用於規則和目標)。 – 2011-02-10 13:06:51

回答

0

經過一些調查研究,我已經想通了,我實際上是兩個主要問題

  1. 的VisitXXX方法不是在源代碼 但實際上訪問的抽象語法樹,訪問節點有生成的IL中的節點。只需比較每種方法生成的IL指令 和每個方法生成的語句。
    我想知道如果FxCop 能夠爲我們提供真正的AST訪問者,我們可以實現什麼?
  2. 爲了回答我最初的問題,爲了防止開發人員編寫太多嵌套的 代碼塊,我們應該自己掃描方法代碼,我的意思是,取出method.BodySourceContext屬性中的起始行和結束行並跟蹤每個 我們找到的'{'和'}'。爲'{'遞增計數器併爲'}'遞減計數器。這應該工作,對吧?