枚举程序集中的命名空间
Enumerate namespaces in assembly
我正在尝试枚举程序集中声明的所有命名空间。
这样做感觉很不雅:
foreach (var syntaxTree in context.Compilation.SyntaxTrees)
{
foreach (var ns in syntaxTree.GetRoot(context.CancellationToken).DescendantNodes().OfType<NamespaceDeclarationSyntax>())
{
...
}
}
执行此操作的好方法是什么?
树行者会好一点,但之前问过,因为我觉得这已经在符号 API 某处。
找到了一种使用 Compilation
的方法,但感觉像个 hack。
var namespaceSymbols = context
.Compilation
.GetSymbolsWithName(x => !string.IsNullOrEmpty(x), SymbolFilter.Namespace)
.Cast<INamespaceSymbol>();
调用 compilation.Assembly.GlobalNamespace
will give you the the merged root namespace that contains all namespaces defined in source. Calling 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);
}
我正在尝试枚举程序集中声明的所有命名空间。 这样做感觉很不雅:
foreach (var syntaxTree in context.Compilation.SyntaxTrees)
{
foreach (var ns in syntaxTree.GetRoot(context.CancellationToken).DescendantNodes().OfType<NamespaceDeclarationSyntax>())
{
...
}
}
执行此操作的好方法是什么? 树行者会好一点,但之前问过,因为我觉得这已经在符号 API 某处。
找到了一种使用 Compilation
的方法,但感觉像个 hack。
var namespaceSymbols = context
.Compilation
.GetSymbolsWithName(x => !string.IsNullOrEmpty(x), SymbolFilter.Namespace)
.Cast<INamespaceSymbol>();
调用 compilation.Assembly.GlobalNamespace
will give you the the merged root namespace that contains all namespaces defined in source. Calling 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);
}