2013-05-22 3 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(); 

Есть ли лучший способ, чем ходьба typeSymbol.BaseType весь путь к System.Object и призывая GetAttributes() на пути?

Также, есть лучший способ проверить, если typeSymbol происходит от определенного класса, чем ходьба .BaseType и проверки вручную

(И да, есть причина, не видна из образца ниже для проверки MethodDeclarationSyntax узлов и не ClassDeclarationSyntax)

ответ

1

tldr; Нет, для этого нет единого вызова метода (по состоянию на сентябрь 2012 г. CTP Roslyn).

родительских классов, которые необходимо искать, может быть (и обычно) совершенно отдельное синтаксическое дерево в класс вы находитесь. Если все ваши классы были в пределах одной namespace декларации (содрогания), то вы можете искать из этого SyntaxNode корень.

Скорее всего, ваши классы являются отдельными файлами, поэтому, хотя они имеют одно и то же пространство имен, они не находятся под одним и тем же корнем дерева синтаксиса.

Roslyn вызывает много царапин на голове, потому что деревья синтаксиса более похожи на расположение файлов кода, а не типы, которые представляет код.

Возможно, существует способ создания нового дерева синтаксиса (существующие деревья синтаксиса неизменяемы) из всех классов, существующих под этим namsepace, а затем поиск этого дерева. Для меня это кажется более сложным, чем необходимо, особенно в том смысле, что метод «шагающий родитель» гораздо удобнее обслуживать.

Смежные вопросы