2016-05-19 6 views
3

Кто-нибудь знает, как я могу получить все доступные типы (семантические) в рамках решения? Создание компиляции из нескольких проектов легко.Получить все типы с Roslyn в решении

MSBuildWorkspace workspace = MSBuildWorkspace.Create(); 
var solution = await workspace.OpenSolutionAsync(solutionPath, cancellationToken); 
var compilations = await Task.WhenAll(solution.Projects.Select(x => x.GetCompilationAsync(cancellationToken))); 

Просто перебирает все ClassDeclarations не достаточно для меня, потому что я хочу, чтобы все типы и связь между ними.

foreach (var tree in compilation.SyntaxTrees) 
{ 
    var source = tree.GetRoot(cancellationToken).DescendantNodes(); 
    var classDeclarations = source.OfType<ClassDeclarationSyntax>(); 
} 

ответ

3

Для данной компиляции вы можете охватить все доступные типы через Compilation.GlobalNamespace перебирает все GetTypeMembers() и GetNamespaceMembers() рекурсивно. Это не дает вам всех типов в решении, но все типы, доступные из текущей компиляции (проекта), через все его ссылки.

0
List<ISymbol> ls = new List<ISymbol>(); 
foreach (Document d in p.Documents) 
{ 
    SemanticModel m = d.GetSemanticModelAsync().Result; 
    List<ClassDeclarationSyntax> lc = d.GetSyntaxRootAsync().Result.DescendantNodes().OfType<ClassDeclaractionSyntax>().ToList(); 
    foreach (var c in lc) 
    { 
     ISymbol s = m.GetDeclaredSymbol(c); 
     ls.Add(s); 
    } 
} 
Смежные вопросы