2016-10-14 15 views
5

Tôi đang cố gắng liệt kê tất cả các không gian tên được khai báo trong một assembly. Làm điều gì đó như thế này cảm thấy rất không phù hợp:Liệt kê các không gian tên trong assembly

foreach (var syntaxTree in context.Compilation.SyntaxTrees) 
{ 
    foreach (var ns in syntaxTree.GetRoot(context.CancellationToken).DescendantNodes().OfType<NamespaceDeclarationSyntax>()) 
    { 
     ...   
    } 
} 

Cách tốt nhất để làm điều này là gì? Một cây walker sẽ đẹp hơn một chút nhưng hỏi trước khi tôi có cảm giác điều này đã có trong API biểu tượng ở đâu đó.

+0

Đó thuộc về mã xét. –

+8

Không, đây là câu hỏi về API roslyn. –

Trả lời

7

Gọi compilation.Assembly.GlobalNamespace sẽ cung cấp cho bạn không gian tên gốc được hợp nhất chứa tất cả các không gian tên được xác định trong nguồn. Gọi compilation.GlobalNamespace sẽ cung cấp cho bạn vùng tên gốc chứa tất cả các không gian tên và các loại được xác định trong mã nguồn hoặc trong siêu dữ liệu tham chiếu.

Từ đó bạn sẽ cần phải đệ quy gọi GetNamespaceMembers để có được tất cả những biểu tượng không gian tên:

IEnumerable<INamespaceSymbol> GetAllNamespaces(INamespaceSymbol namespaceSymbol) 
{ 
    foreach (INamespaceSymbol symbol in namespaceSymbol.GetNamespaceMembers()) 
    { 
     yield return symbol; 
     foreach (INamespaceSymbol childSymbol in GetAllNamespaces(symbol)) 
     { 
      yield return symbol; 
     } 
    } 
} 

var allNamespaceNodes = new List<NamespaceDeclarationSyntax>(); 
foreach (INamespaceSymbol namespaceSymbol in GetAllNamespaces(compilation.GlobalNamespace)) 
{ 
    allNamespaceNodes.AddRange(from syntaxReference in namespaceSymbol.DeclaringSyntaxReferences 
           select syntaxReference.GetSyntax(cancellationToken) as NamespaceDeclarationSyntax); 
} 
6

Tìm cách sử dụng Compilation nhưng cảm thấy như bị hack.

var namespaceSymbols = context 
    .Compilation 
    .GetSymbolsWithName(x => !string.IsNullOrEmpty(x), SymbolFilter.Namespace) 
    .Cast<INamespaceSymbol>(); 
Các vấn đề liên quan