【发布时间】:2017-04-18 10:25:16
【问题描述】:
我正在使用以下代码来检索代码块中使用的所有符号。这包括声明和对符号的引用。 不幸的是,GetSymbolInfo 调用非常慢,因此该方法花费的总时间可能很长。有没有办法加快速度?
public static IEnumerable<ISymbol> GetAllSymbols(CSharpCompilation compilation, SyntaxNode root)
{
var noDuplicates = new HashSet<ISymbol>();
var model = compilation.GetSemanticModel(root.SyntaxTree);
foreach (var node in root.DescendantNodesAndSelf())
{
ISymbol symbol = model.GetDeclaredSymbol(node) ??
model.GetSymbolInfo(node).Symbol;
if (symbol != null)
{
if (noDuplicates.Add(symbol))
yield return symbol;
}
}
}
【问题讨论】:
-
是的。您正在为每个节点调用 GetSymbolInfo,但我怀疑您是否需要它。例如,当您有
using System.Collections.Generic;之类的 using 声明时,您真的需要 System 和 System.Collections 命名空间的符号吗?所以开始考虑你需要什么符号。
标签: c# roslyn roslyn-code-analysis