2011-02-09 1 views
3

사용자 정의 FxCop 코드 분석 규칙 을 작성하려고합니다. 코드 패턴이 너무 깊게 중첩 된 코드 블록 인 이 포함 된 메소드를 개발자에게 경고하고 재 처리를 요청합니다.FxCop 인트로 스펙션 코드 분석 끝없는 루프

ex. 나는 다음과 같은 상황을 피하기 위해 노력하고있어 나는 VisitBlock(Block block) 메소드를 오버라이드 (override) 할 때

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

나는 유래를 얻을 수를 블록의 깊이를 계산
, 외관상의 특성 중 하나에서 순환 참조 이 있기 때문에 블록 블록. 다음은 일부 i에 해당합니다. 문장 : [i] == 블록

왜 그런 순환 참조가 존재합니까? 어떻게 피하는가? 감사합니다.

+1

문제를 재현하는 예제 코드 (규칙 및 대상 모두에 해당)를 입력하십시오. –

답변

0

좀 더 연구 한 후, 나는 실제로 두 가지 주요 문제

  1. VisitXXX 방법이 실제로 방문하는 소스 코드의 추상 구문 트리의 노드를 방문하지 않는 한 알아 냈어요 생성 된 IL의 노드. 메소드 에 대해 생성 된 IL 명령어와 method.Body에 대해 생성 된 구문을 비교하면됩니다.
    FxCop 이 진정한 AST 방문자를 제공 할 수 있다면 무엇을 달성했는지 궁금합니다.
  2. 초기 질문에 대답하기 위해 개발자가 코드 블록을 너무 많이 중첩하여 쓰는 것을 막기 위해 method.BodySourceContext 속성 안의 시작 줄과 끝 줄을 직접 가져와야합니다. 우리가 찾은 '{'와 '}'을 마다 추적합니다. '{'의 증가 카운터와 '}'의 감소 카운터. 그럴거야, 맞지?