2014-04-23 8 views
2

에서 ICodeElement를 얻을이 같은 자바 스타일의 매력적인 브래킷 stylecop에서 사용자 지정 규칙을 코딩하는 시도 :어떻게 CsToken

public void myfunction(int argument) { 
body(); 
//....... 
} 

내 실제 코드는 다음과 같습니다

public override void AnalyzeDocument(CodeDocument document) { 
       var csharpDocument = (CsDocument)document; 

       for (var tokenNode = csharpDocument.Tokens.First; tokenNode != null; tokenNode = tokenNode.Next) { 

       if (tokenNode.Value.CsTokenType == CsTokenType.OpenCurlyBracket) { 
         if (tokenNode.Value.LineNumber == tokenNode.Previous.Value.LineNumber 
          || tokenNode.Value.LineNumber == tokenNode.Next.Value.LineNumber) { 
          this.AddViolation(tokenNode.Value, 
               tokenNode.Value.LineNumber, 
               "OpenCurlyBracketBadLocation"); 
         } 
        } 

       if (tokenNode.Value.CsTokenType == CsTokenType.CloseCurlyBracket) { 
         if (tokenNode.Value.LineNumber != tokenNode.Previous.Value.LineNumber 
          || tokenNode.Value.LineNumber == tokenNode.Next.Value.LineNumber) { 
          this.AddViolation(tokenNode.Value, 
               tokenNode.Value.LineNumber, 
               "CloseCurlyBracketBadLocation"); 
         } 
        } 

       } 

그러나이 라인 :

this.AddViolation(tokenNode.Value, 
        tokenNode.Value.LineNumber, 
        "CloseCurlyBracketBadLocation"); 

함수 인수 형식이 일치하지 않기 때문에 컴파일되지 않습니다. 첫 번째 인수는 ICodeElement가 필요하고 CsToken이 있습니다 ... 그러나 SDK에서이 방법을 사용했습니다 ... 그럼 누구든지 해결책을 알고 있습니까? 아니면 더 좋은 방법일까요?

답변

0

첫 번째 인수가 ICodeElement 인 이유는 위반 대상이 SuppressMessageAttribute이 적용될 수있는 것이어야한다는 것입니다. ICodeElement을 찾을 때까지 토큰의 Parent 체인을 올라갈 수는 있지만, 그렇게 효율적이지는 않습니다. 의도 된 SDK 사용법에 더 잘 부합하는 접근법은 WalkDocument 메서드를 사용하여 요소를 방문하는 것입니다 (StyleCop 자체의 중괄호 확인 규칙을 구현하는 내장 된 StyleCop.CSharp.LayoutRules analyzer 에서처럼).