2016-10-14 6 views
5

मैं एक असेंबली में घोषित सभी नामस्थानों की गणना करने की कोशिश कर रहा हूं। इस तरह करने से कुछ बहुत असजीला लगता है:विधानसभा में संख्यात्मक नामस्थान

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

यह करने के लिए अच्छा तरीका क्या है? एक पेड़ वॉकर थोड़ा अच्छा होगा लेकिन पहले पूछ रहा था क्योंकि मुझे लगता है कि यह पहले से ही प्रतीक एपीआई में है।

+0

समीक्षा कोड के अंतर्गत आता है यही कारण है कि। –

+8

नहीं, यह roslyn एपीआई के बारे में एक सवाल है। –

उत्तर

7

कॉलिंग compilation.Assembly.GlobalNamespace आप विलय कर दिया जड़ नाम स्थान है कि सभी नामस्थान स्रोत में परिभाषित होता है दे देंगे। compilation.GlobalNamespace पर कॉल करने से आपको रूट नेमस्पेस मिलेगा जिसमें स्रोत कोड या संदर्भित मेटाडेटा में परिभाषित सभी नामस्थान और प्रकार शामिल होंगे।

वहां से आप रिकर्सिवली सभी नाम स्थान प्रतीकों पाने के लिए GetNamespaceMembers कॉल करने के लिए की आवश्यकता होगी:

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

Compilation का उपयोग करके एक तरीका मिला लेकिन एक हैक जैसा लगता है।

var namespaceSymbols = context 
    .Compilation 
    .GetSymbolsWithName(x => !string.IsNullOrEmpty(x), SymbolFilter.Namespace) 
    .Cast<INamespaceSymbol>();