2013-05-22 2 views
4

클래스 (또는 기본 유형 중 하나)에 특정 속성이 있는지 여부를 감지하기 위해 ICodeIssueProvider을 구현하려고합니다.기본 유형의 속성 찾기

public IEnumerable<CodeIssue> GetIssues(IDocument document, 
     CommonSyntaxNode node, 
     CancellationToken cancellationToken) 
    { 
     var methodDeclaration = (MethodDeclarationSyntax)node; 
     var semanticModel = document.GetSemanticModel(cancellationToken); 

     var methodSymbol = semanticModel.GetDeclaredSymbol(methodDeclaration); 
     var typeSymbol = methodSymbol.ContainingType; 

     // The following only gets attributes declared on this class, how to 
     // also include those declared on a base class ? 
     var attributes = typeSymbol.GetAttributes(); 

System.ObjecttypeSymbol.BaseType 모든 길을 걷고있는 길에 GetAttributes()를 호출하는 것보다 더 좋은 방법이 있나요? 또한

하는 typeSymbol.BaseType를 걸어 수동

을 (체크보다는 특정 클래스에서 파생 여부를 확인하기 위해 더 나은 방법이 그리고 네, 이유가 MethodDeclarationSyntax 노드를 확인하기 위해 아래의 샘플에서 분명이 없다 및 아니 ClassDeclarationSyntax 노드)

답변

1

tldr; 아니요, 이렇게하는 단일 메서드 호출이 없습니다 (2012 년 9 월 CTP Roslyn 기준).

검색해야 할 상위 클래스는 현재있는 클래스와 완전히 다른 구문 트리가 될 수 있습니다. 모든 클래스가 하나의 namespace 선언 (떨림) 내에 있으면 SyntaxNode에서 검색 할 수 있습니다. 뿌리.

클래스는 파일 당 하나의 클래스이므로 같은 이름 공간을 공유하지만 동일한 구문 트리 루트가 아닙니다.

구문 나무가 코드 유형을 나타내는 것이 아니라 코드 파일의 레이아웃과 유사하기 때문에 Roslyn은 많은 머리를 긁어냅니다.

namsepace 아래에있는 모든 클래스 중에서 새로운 구문 트리 (기존 구문 나무는 변경 불가능)를 만든 다음 해당 트리를 검색하는 방법이있을 수 있습니다. 나에게 그것은 필요한 것보다 더 복잡한 것처럼 느껴진다. 특히 워킹업 부모 방법이 훨씬 더 유지 보수 가능하기 때문이다.